DRYD-31 Drydock driven by a config file
Config file support via oslo_config Example config file in examples/drydock.conf
This commit is contained in:
parent
fbbb6b5186
commit
28d460590c
|
@ -11,3 +11,8 @@
|
||||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
# See the License for the specific language governing permissions and
|
# See the License for the specific language governing permissions and
|
||||||
# limitations under the License.
|
# limitations under the License.
|
||||||
|
|
||||||
|
from .config import DrydockConfig
|
||||||
|
|
||||||
|
config_mgr = DrydockConfig()
|
||||||
|
conf = config_mgr.conf
|
|
@ -12,31 +12,55 @@
|
||||||
# See the License for the specific language governing permissions and
|
# See the License for the specific language governing permissions and
|
||||||
# limitations under the License.
|
# limitations under the License.
|
||||||
#
|
#
|
||||||
|
from oslo_config import cfg
|
||||||
#
|
|
||||||
# Read application configuration
|
|
||||||
#
|
|
||||||
|
|
||||||
# configuration map with defaults
|
|
||||||
|
|
||||||
class DrydockConfig(object):
|
class DrydockConfig(object):
|
||||||
|
"""
|
||||||
|
Initialize all the core options
|
||||||
|
"""
|
||||||
|
# Core/General options
|
||||||
|
logging_options = [
|
||||||
|
cfg.StrOpt('log_level', default='INFO', help='Global log level for Drydock'),
|
||||||
|
cfg.StrOpt('global_logger_name', default='drydock', help='Logger name for the top-level logger'),
|
||||||
|
cfg.StrOpt('oobdriver_logger_name', default='${global_logger_name}.oobdriver'),
|
||||||
|
cfg.StrOpt('nodedriver_logger_name', default='${global_logger_name}.nodedriver'),
|
||||||
|
cfg.StrOpt('control_logger_name', default='${global_logger_name}.control'),
|
||||||
|
]
|
||||||
|
|
||||||
global_config = {
|
# API Authentication options
|
||||||
'log_level': 'DEBUG',
|
auth_options = [
|
||||||
}
|
cfg.StrOpt('admin_token', default='bigboss', help='X-Auth-Token value to bypass backend authentication'),
|
||||||
|
cfg.BoolOpt('bypass_enabled', default=False, help='Can backend authentication be bypassed?'),
|
||||||
|
]
|
||||||
|
|
||||||
node_driver = {
|
# Enabled plugins
|
||||||
'maasdriver': {
|
plugin_options = [
|
||||||
},
|
cfg.MultiStrOpt('ingester',
|
||||||
}
|
default=['drydock_provisioner.ingester.plugins.yaml.YamlIngester'],
|
||||||
|
help='Module path string of a input ingester to enable'),
|
||||||
|
cfg.MultiStrOpt('oob_driver',
|
||||||
|
default=['drydock_provisioner.drivers.oob.pyghmi_driver.PyghmiDriver'],
|
||||||
|
help='Module path string of a OOB driver to enable'),
|
||||||
|
cfg.StrOpt('node_driver',
|
||||||
|
default='drydock_provisioner.drivers.node.maasdriver.driver.MaasNodeDriver',
|
||||||
|
help='Module path string of the Node driver to enable'),
|
||||||
|
cfg.StrOpt('network_driver',
|
||||||
|
default=None, help='Module path string of the Network driver to enable'),
|
||||||
|
]
|
||||||
|
|
||||||
ingester_config = {
|
# Timeouts for various tasks specified in minutes
|
||||||
'plugins': ['drydock_provisioner.ingester.plugins.yaml.YamlIngester'],
|
timeout_options = [
|
||||||
}
|
cfg.IntOpt('create_network_template',default=2,help='Timeout in minutes for creating site network templates'),
|
||||||
|
cfg.IntOpt('identify_node',default=10,help='Timeout in minutes for initial node identification'),
|
||||||
|
cfg.IntOpt('configure_hardware',default=30,help='Timeout in minutes for node commissioning and hardware configuration'),
|
||||||
|
cfg.IntOpt('apply_node_networking',default=5,help='Timeout in minutes for configuring node networking'),
|
||||||
|
cfg.IntOpt('deploy_node',default=45,help='Timeout in minutes for deploying a node'),
|
||||||
|
]
|
||||||
|
|
||||||
orchestrator_config = {
|
def __init__(self):
|
||||||
'drivers': {
|
self.conf = cfg.ConfigOpts()
|
||||||
'oob': 'drydock_provisioner.drivers.oob.pyghmi_driver.PyghmiDriver',
|
|
||||||
'node': 'drydock_provisioner.drivers.node.maasdriver.driver.MaasNodeDriver',
|
self.conf.register_opts(DrydockConfig.logging_options, group='logging')
|
||||||
}
|
self.conf.register_opts(DrydockConfig.auth_options, group='authentication')
|
||||||
}
|
self.conf.register_opts(DrydockConfig.plugin_options, group='plugins')
|
||||||
|
self.conf.register_opts(DrydockConfig.timeout_options, group='timeouts')
|
||||||
|
|
|
@ -16,7 +16,7 @@ import falcon
|
||||||
import logging
|
import logging
|
||||||
import uuid
|
import uuid
|
||||||
|
|
||||||
import drydock_provisioner.config as config
|
import drydock_provisioner
|
||||||
|
|
||||||
class AuthMiddleware(object):
|
class AuthMiddleware(object):
|
||||||
|
|
||||||
|
@ -66,7 +66,7 @@ class ContextMiddleware(object):
|
||||||
|
|
||||||
requested_logging = req.get_header('X-Log-Level')
|
requested_logging = req.get_header('X-Log-Level')
|
||||||
|
|
||||||
if (config.DrydockConfig.global_config.get('log_level', '') == 'DEBUG' or
|
if (drydock_provisioner.conf.logging.log_level == 'DEBUG' or
|
||||||
(requested_logging == 'DEBUG' and 'admin' in ctx.roles)):
|
(requested_logging == 'DEBUG' and 'admin' in ctx.roles)):
|
||||||
ctx.set_log_level('DEBUG')
|
ctx.set_log_level('DEBUG')
|
||||||
elif requested_logging == 'INFO':
|
elif requested_logging == 'INFO':
|
||||||
|
@ -78,7 +78,7 @@ class ContextMiddleware(object):
|
||||||
class LoggingMiddleware(object):
|
class LoggingMiddleware(object):
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
self.logger = logging.getLogger('drydock.control')
|
self.logger = logging.getLogger(drydock_provisioner.conf.logging.control_logger_name)
|
||||||
|
|
||||||
def process_response(self, req, resp, resource, req_succeeded):
|
def process_response(self, req, resp, resource, req_succeeded):
|
||||||
ctx = req.context
|
ctx = req.context
|
||||||
|
|
|
@ -43,6 +43,8 @@ class MaasRequestFactory(object):
|
||||||
def __init__(self, base_url, apikey):
|
def __init__(self, base_url, apikey):
|
||||||
self.base_url = base_url
|
self.base_url = base_url
|
||||||
self.apikey = apikey
|
self.apikey = apikey
|
||||||
|
|
||||||
|
print("Creating MaaS API client for URL %s with key %s" % (base_url, apikey))
|
||||||
self.signer = MaasOauth(apikey)
|
self.signer = MaasOauth(apikey)
|
||||||
self.http_session = requests.Session()
|
self.http_session = requests.Session()
|
||||||
|
|
||||||
|
|
|
@ -16,8 +16,10 @@ import logging
|
||||||
import traceback
|
import traceback
|
||||||
import sys
|
import sys
|
||||||
|
|
||||||
|
from oslo_config import cfg
|
||||||
|
|
||||||
|
import drydock_provisioner
|
||||||
import drydock_provisioner.error as errors
|
import drydock_provisioner.error as errors
|
||||||
import drydock_provisioner.config as config
|
|
||||||
import drydock_provisioner.drivers as drivers
|
import drydock_provisioner.drivers as drivers
|
||||||
import drydock_provisioner.objects.fields as hd_fields
|
import drydock_provisioner.objects.fields as hd_fields
|
||||||
import drydock_provisioner.objects.task as task_model
|
import drydock_provisioner.objects.task as task_model
|
||||||
|
@ -32,6 +34,11 @@ import drydock_provisioner.drivers.node.maasdriver.models.machine as maas_machin
|
||||||
|
|
||||||
class MaasNodeDriver(NodeDriver):
|
class MaasNodeDriver(NodeDriver):
|
||||||
|
|
||||||
|
maasdriver_options = [
|
||||||
|
cfg.StrOpt('maas_api_key', help='The API key for accessing MaaS'),
|
||||||
|
cfg.StrOpt('maas_api_url', help='The URL for accessing MaaS API'),
|
||||||
|
]
|
||||||
|
|
||||||
def __init__(self, **kwargs):
|
def __init__(self, **kwargs):
|
||||||
super(MaasNodeDriver, self).__init__(**kwargs)
|
super(MaasNodeDriver, self).__init__(**kwargs)
|
||||||
|
|
||||||
|
@ -39,9 +46,13 @@ class MaasNodeDriver(NodeDriver):
|
||||||
self.driver_key = "maasdriver"
|
self.driver_key = "maasdriver"
|
||||||
self.driver_desc = "MaaS Node Provisioning Driver"
|
self.driver_desc = "MaaS Node Provisioning Driver"
|
||||||
|
|
||||||
self.config = config.DrydockConfig.node_driver[self.driver_key]
|
self.setup_config_options(drydock_provisioner.conf)
|
||||||
|
|
||||||
self.logger = logging.getLogger('drydock.nodedriver.maasdriver')
|
self.logger = logging.getLogger("%s.%s" %
|
||||||
|
(drydock_provisioner.conf.logging.nodedriver_logger_name, self.driver_key))
|
||||||
|
|
||||||
|
def setup_config_options(self, conf):
|
||||||
|
conf.register_opts(MaasNodeDriver.maasdriver_options, group=self.driver_key)
|
||||||
|
|
||||||
def execute_task(self, task_id):
|
def execute_task(self, task_id):
|
||||||
task = self.state_manager.get_task(task_id)
|
task = self.state_manager.get_task(task_id)
|
||||||
|
@ -56,7 +67,7 @@ class MaasNodeDriver(NodeDriver):
|
||||||
if task.action == hd_fields.OrchestratorAction.ValidateNodeServices:
|
if task.action == hd_fields.OrchestratorAction.ValidateNodeServices:
|
||||||
self.orchestrator.task_field_update(task.get_id(),
|
self.orchestrator.task_field_update(task.get_id(),
|
||||||
status=hd_fields.TaskStatus.Running)
|
status=hd_fields.TaskStatus.Running)
|
||||||
maas_client = MaasRequestFactory(self.config['api_url'], self.config['api_key'])
|
maas_client = MaasRequestFactory(drydock_provisioner.conf.maasdriver.maas_api_url, drydock_provisioner.conf.maasdriver.maas_api_key)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
if maas_client.test_connectivity():
|
if maas_client.test_connectivity():
|
||||||
|
@ -122,16 +133,13 @@ class MaasNodeDriver(NodeDriver):
|
||||||
task_scope={'site': task.site_name})
|
task_scope={'site': task.site_name})
|
||||||
runner = MaasTaskRunner(state_manager=self.state_manager,
|
runner = MaasTaskRunner(state_manager=self.state_manager,
|
||||||
orchestrator=self.orchestrator,
|
orchestrator=self.orchestrator,
|
||||||
task_id=subtask.get_id(),config=self.config)
|
task_id=subtask.get_id())
|
||||||
|
|
||||||
self.logger.info("Starting thread for task %s to create network templates" % (subtask.get_id()))
|
self.logger.info("Starting thread for task %s to create network templates" % (subtask.get_id()))
|
||||||
|
|
||||||
runner.start()
|
runner.start()
|
||||||
|
|
||||||
# TODO Figure out coherent system for putting all the timeouts in
|
runner.join(timeout=drydock_provisioner.conf.timeouts.create_network_template * 60)
|
||||||
# the config
|
|
||||||
|
|
||||||
runner.join(timeout=120)
|
|
||||||
|
|
||||||
if runner.is_alive():
|
if runner.is_alive():
|
||||||
result = {
|
result = {
|
||||||
|
@ -174,7 +182,7 @@ class MaasNodeDriver(NodeDriver):
|
||||||
task_scope={'site': task.site_name, 'node_names': [n]})
|
task_scope={'site': task.site_name, 'node_names': [n]})
|
||||||
runner = MaasTaskRunner(state_manager=self.state_manager,
|
runner = MaasTaskRunner(state_manager=self.state_manager,
|
||||||
orchestrator=self.orchestrator,
|
orchestrator=self.orchestrator,
|
||||||
task_id=subtask.get_id(),config=self.config)
|
task_id=subtask.get_id())
|
||||||
|
|
||||||
self.logger.info("Starting thread for task %s to identify node %s" % (subtask.get_id(), n))
|
self.logger.info("Starting thread for task %s to identify node %s" % (subtask.get_id(), n))
|
||||||
|
|
||||||
|
@ -185,8 +193,7 @@ class MaasNodeDriver(NodeDriver):
|
||||||
attempts = 0
|
attempts = 0
|
||||||
worked = failed = False
|
worked = failed = False
|
||||||
|
|
||||||
#TODO Add timeout to config
|
while running_subtasks > 0 and attempts < drydock_provisioner.conf.timeouts.identify_node:
|
||||||
while running_subtasks > 0 and attempts < 3:
|
|
||||||
for t in subtasks:
|
for t in subtasks:
|
||||||
subtask = self.state_manager.get_task(t)
|
subtask = self.state_manager.get_task(t)
|
||||||
|
|
||||||
|
@ -244,7 +251,7 @@ class MaasNodeDriver(NodeDriver):
|
||||||
task_scope={'site': task.site_name, 'node_names': [n]})
|
task_scope={'site': task.site_name, 'node_names': [n]})
|
||||||
runner = MaasTaskRunner(state_manager=self.state_manager,
|
runner = MaasTaskRunner(state_manager=self.state_manager,
|
||||||
orchestrator=self.orchestrator,
|
orchestrator=self.orchestrator,
|
||||||
task_id=subtask.get_id(),config=self.config)
|
task_id=subtask.get_id())
|
||||||
|
|
||||||
self.logger.info("Starting thread for task %s to commission node %s" % (subtask.get_id(), n))
|
self.logger.info("Starting thread for task %s to commission node %s" % (subtask.get_id(), n))
|
||||||
|
|
||||||
|
@ -256,7 +263,7 @@ class MaasNodeDriver(NodeDriver):
|
||||||
worked = failed = False
|
worked = failed = False
|
||||||
|
|
||||||
#TODO Add timeout to config
|
#TODO Add timeout to config
|
||||||
while running_subtasks > 0 and attempts < 20:
|
while running_subtasks > 0 and attempts < drydock_provisioner.conf.timeouts.configure_hardware:
|
||||||
for t in subtasks:
|
for t in subtasks:
|
||||||
subtask = self.state_manager.get_task(t)
|
subtask = self.state_manager.get_task(t)
|
||||||
|
|
||||||
|
@ -314,7 +321,7 @@ class MaasNodeDriver(NodeDriver):
|
||||||
task_scope={'site': task.site_name, 'node_names': [n]})
|
task_scope={'site': task.site_name, 'node_names': [n]})
|
||||||
runner = MaasTaskRunner(state_manager=self.state_manager,
|
runner = MaasTaskRunner(state_manager=self.state_manager,
|
||||||
orchestrator=self.orchestrator,
|
orchestrator=self.orchestrator,
|
||||||
task_id=subtask.get_id(),config=self.config)
|
task_id=subtask.get_id())
|
||||||
|
|
||||||
self.logger.info("Starting thread for task %s to configure networking on node %s" % (subtask.get_id(), n))
|
self.logger.info("Starting thread for task %s to configure networking on node %s" % (subtask.get_id(), n))
|
||||||
|
|
||||||
|
@ -325,8 +332,7 @@ class MaasNodeDriver(NodeDriver):
|
||||||
attempts = 0
|
attempts = 0
|
||||||
worked = failed = False
|
worked = failed = False
|
||||||
|
|
||||||
#TODO Add timeout to config
|
while running_subtasks > 0 and attempts < drydock_provisioner.conf.timeouts.apply_node_networking:
|
||||||
while running_subtasks > 0 and attempts < 2:
|
|
||||||
for t in subtasks:
|
for t in subtasks:
|
||||||
subtask = self.state_manager.get_task(t)
|
subtask = self.state_manager.get_task(t)
|
||||||
|
|
||||||
|
@ -384,7 +390,7 @@ class MaasNodeDriver(NodeDriver):
|
||||||
task_scope={'site': task.site_name, 'node_names': [n]})
|
task_scope={'site': task.site_name, 'node_names': [n]})
|
||||||
runner = MaasTaskRunner(state_manager=self.state_manager,
|
runner = MaasTaskRunner(state_manager=self.state_manager,
|
||||||
orchestrator=self.orchestrator,
|
orchestrator=self.orchestrator,
|
||||||
task_id=subtask.get_id(),config=self.config)
|
task_id=subtask.get_id())
|
||||||
|
|
||||||
self.logger.info("Starting thread for task %s to deploy node %s" % (subtask.get_id(), n))
|
self.logger.info("Starting thread for task %s to deploy node %s" % (subtask.get_id(), n))
|
||||||
|
|
||||||
|
@ -395,8 +401,7 @@ class MaasNodeDriver(NodeDriver):
|
||||||
attempts = 0
|
attempts = 0
|
||||||
worked = failed = False
|
worked = failed = False
|
||||||
|
|
||||||
#TODO Add timeout to config
|
while running_subtasks > 0 and attempts < drydock_provisioner.conf.timeouts.deploy_node:
|
||||||
while running_subtasks > 0 and attempts < 120:
|
|
||||||
for t in subtasks:
|
for t in subtasks:
|
||||||
subtask = self.state_manager.get_task(t)
|
subtask = self.state_manager.get_task(t)
|
||||||
|
|
||||||
|
@ -435,10 +440,10 @@ class MaasNodeDriver(NodeDriver):
|
||||||
|
|
||||||
class MaasTaskRunner(drivers.DriverTaskRunner):
|
class MaasTaskRunner(drivers.DriverTaskRunner):
|
||||||
|
|
||||||
def __init__(self, config=None, **kwargs):
|
def __init__(self, **kwargs):
|
||||||
super(MaasTaskRunner, self).__init__(**kwargs)
|
super(MaasTaskRunner, self).__init__(**kwargs)
|
||||||
|
|
||||||
self.driver_config = config
|
# TODO Need to build this name from configs
|
||||||
self.logger = logging.getLogger('drydock.nodedriver.maasdriver')
|
self.logger = logging.getLogger('drydock.nodedriver.maasdriver')
|
||||||
|
|
||||||
def execute_task(self):
|
def execute_task(self):
|
||||||
|
@ -448,8 +453,8 @@ class MaasTaskRunner(drivers.DriverTaskRunner):
|
||||||
status=hd_fields.TaskStatus.Running,
|
status=hd_fields.TaskStatus.Running,
|
||||||
result=hd_fields.ActionResult.Incomplete)
|
result=hd_fields.ActionResult.Incomplete)
|
||||||
|
|
||||||
self.maas_client = MaasRequestFactory(self.driver_config['api_url'],
|
self.maas_client = MaasRequestFactory(drydock_provisioner.conf.maasdriver.maas_api_url,
|
||||||
self.driver_config['api_key'])
|
drydock_provisioner.conf.maasdriver.maas_api_key)
|
||||||
|
|
||||||
site_design = self.orchestrator.get_effective_site(self.task.design_id)
|
site_design = self.orchestrator.get_effective_site(self.task.design_id)
|
||||||
|
|
||||||
|
@ -738,7 +743,7 @@ class MaasTaskRunner(drivers.DriverTaskRunner):
|
||||||
# Poll machine status
|
# Poll machine status
|
||||||
attempts = 0
|
attempts = 0
|
||||||
|
|
||||||
while attempts < 30 and machine.status_name != 'Ready':
|
while attempts < drydock_provisioner.conf.timeouts.configure_hardware and machine.status_name != 'Ready':
|
||||||
attempts = attempts + 1
|
attempts = attempts + 1
|
||||||
time.sleep(1 * 60)
|
time.sleep(1 * 60)
|
||||||
try:
|
try:
|
||||||
|
@ -970,7 +975,7 @@ class MaasTaskRunner(drivers.DriverTaskRunner):
|
||||||
continue
|
continue
|
||||||
|
|
||||||
attempts = 0
|
attempts = 0
|
||||||
while attempts < 120 and not machine.status_name.startswith('Deployed'):
|
while attempts < drydock_provisioner.conf.timeouts.deploy_node and not machine.status_name.startswith('Deployed'):
|
||||||
attempts = attempts + 1
|
attempts = attempts + 1
|
||||||
time.sleep(1 * 60)
|
time.sleep(1 * 60)
|
||||||
try:
|
try:
|
||||||
|
|
|
@ -14,8 +14,9 @@
|
||||||
import time
|
import time
|
||||||
import logging
|
import logging
|
||||||
|
|
||||||
|
import drydock_provisioner
|
||||||
import drydock_provisioner.error as errors
|
import drydock_provisioner.error as errors
|
||||||
import drydock_provisioner.config as config
|
|
||||||
|
|
||||||
import drydock_provisioner.objects.fields as hd_fields
|
import drydock_provisioner.objects.fields as hd_fields
|
||||||
import drydock_provisioner.objects.task as task_model
|
import drydock_provisioner.objects.task as task_model
|
||||||
|
@ -35,8 +36,8 @@ class ManualDriver(oob.OobDriver):
|
||||||
self.driver_key = "manual_driver"
|
self.driver_key = "manual_driver"
|
||||||
self.driver_desc = "Manual (Noop) OOB Driver"
|
self.driver_desc = "Manual (Noop) OOB Driver"
|
||||||
|
|
||||||
self.logger = logging.getLogger('drydock.oobdriver.pyghmi')
|
self.logger = logging.getLogger("%s.%s" %
|
||||||
self.config = config.DrydockConfig.node_driver.get(self.driver_key, {})
|
(drydock_provisioner.conf.logging.oobdriver_logger_name, self.driver_key))
|
||||||
|
|
||||||
def execute_task(self, task_id):
|
def execute_task(self, task_id):
|
||||||
task = self.state_manager.get_task(task_id)
|
task = self.state_manager.get_task(task_id)
|
||||||
|
|
|
@ -16,8 +16,8 @@ import logging
|
||||||
|
|
||||||
from pyghmi.ipmi.command import Command
|
from pyghmi.ipmi.command import Command
|
||||||
|
|
||||||
|
import drydock_provisioner
|
||||||
import drydock_provisioner.error as errors
|
import drydock_provisioner.error as errors
|
||||||
import drydock_provisioner.config as config
|
|
||||||
|
|
||||||
import drydock_provisioner.objects.fields as hd_fields
|
import drydock_provisioner.objects.fields as hd_fields
|
||||||
import drydock_provisioner.objects.task as task_model
|
import drydock_provisioner.objects.task as task_model
|
||||||
|
@ -37,8 +37,8 @@ class PyghmiDriver(oob.OobDriver):
|
||||||
self.driver_key = "pyghmi_driver"
|
self.driver_key = "pyghmi_driver"
|
||||||
self.driver_desc = "Pyghmi OOB Driver"
|
self.driver_desc = "Pyghmi OOB Driver"
|
||||||
|
|
||||||
self.logger = logging.getLogger('drydock.oobdriver.pyghmi')
|
self.logger = logging.getLogger("%s.%s" %
|
||||||
self.config = config.DrydockConfig.node_driver.get(self.driver_key, {})
|
(drydock_provisioner.conf.logging.oobdriver_logger_name, self.driver_key))
|
||||||
|
|
||||||
def execute_task(self, task_id):
|
def execute_task(self, task_id):
|
||||||
task = self.state_manager.get_task(task_id)
|
task = self.state_manager.get_task(task_id)
|
||||||
|
@ -99,20 +99,16 @@ class PyghmiDriver(oob.OobDriver):
|
||||||
task_id=subtask.get_id(), node=n)
|
task_id=subtask.get_id(), node=n)
|
||||||
runner.start()
|
runner.start()
|
||||||
|
|
||||||
# Wait for subtasks to complete
|
attempts = 0
|
||||||
# TODO need some kind of timeout
|
while len(incomplete_subtasks) > 0 and attempts <= getattr(drydock_provisioner.conf.timeouts, task.action, 5):
|
||||||
i = 0
|
|
||||||
while len(incomplete_subtasks) > 0:
|
|
||||||
for n in incomplete_subtasks:
|
for n in incomplete_subtasks:
|
||||||
t = self.state_manager.get_task(n)
|
t = self.state_manager.get_task(n)
|
||||||
if t.get_status() in [hd_fields.TaskStatus.Terminated,
|
if t.get_status() in [hd_fields.TaskStatus.Terminated,
|
||||||
hd_fields.TaskStatus.Complete,
|
hd_fields.TaskStatus.Complete,
|
||||||
hd_fields.TaskStatus.Errored]:
|
hd_fields.TaskStatus.Errored]:
|
||||||
incomplete_subtasks.remove(n)
|
incomplete_subtasks.remove(n)
|
||||||
time.sleep(2)
|
time.sleep(1 * 60)
|
||||||
i = i+1
|
attempts = attempts + 1
|
||||||
if i == 5:
|
|
||||||
break
|
|
||||||
|
|
||||||
task = self.state_manager.get_task(task.get_id())
|
task = self.state_manager.get_task(task.get_id())
|
||||||
subtasks = map(self.state_manager.get_task, task.get_subtasks())
|
subtasks = map(self.state_manager.get_task, task.get_subtasks())
|
||||||
|
|
|
@ -12,8 +12,10 @@
|
||||||
# See the License for the specific language governing permissions and
|
# See the License for the specific language governing permissions and
|
||||||
# limitations under the License.
|
# limitations under the License.
|
||||||
import logging
|
import logging
|
||||||
|
from oslo_config import cfg
|
||||||
|
import sys
|
||||||
|
|
||||||
import drydock_provisioner.config as config
|
import drydock_provisioner
|
||||||
import drydock_provisioner.objects as objects
|
import drydock_provisioner.objects as objects
|
||||||
import drydock_provisioner.ingester as ingester
|
import drydock_provisioner.ingester as ingester
|
||||||
import drydock_provisioner.statemgmt as statemgmt
|
import drydock_provisioner.statemgmt as statemgmt
|
||||||
|
@ -23,17 +25,28 @@ import drydock_provisioner.control.api as api
|
||||||
def start_drydock():
|
def start_drydock():
|
||||||
objects.register_all()
|
objects.register_all()
|
||||||
|
|
||||||
# Setup root logger
|
# Setup configuration parsing
|
||||||
logger = logging.getLogger('drydock')
|
cli_options = [
|
||||||
|
cfg.BoolOpt('debug', short='d', default=False, help='Enable debug logging'),
|
||||||
|
]
|
||||||
|
|
||||||
logger.setLevel(config.DrydockConfig.global_config.get('log_level'))
|
drydock_provisioner.conf.register_cli_opts(cli_options)
|
||||||
|
drydock_provisioner.conf(sys.argv[1:])
|
||||||
|
|
||||||
|
if drydock_provisioner.conf.debug:
|
||||||
|
drydock_provisioner.conf.logging.log_level = 'DEBUG'
|
||||||
|
|
||||||
|
# Setup root logger
|
||||||
|
logger = logging.getLogger(drydock_provisioner.conf.logging.global_logger_name)
|
||||||
|
|
||||||
|
logger.setLevel(drydock_provisioner.conf.logging.log_level)
|
||||||
ch = logging.StreamHandler()
|
ch = logging.StreamHandler()
|
||||||
formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(filename)s:%(funcName)s - %(message)s')
|
formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(filename)s:%(funcName)s - %(message)s')
|
||||||
ch.setFormatter(formatter)
|
ch.setFormatter(formatter)
|
||||||
logger.addHandler(ch)
|
logger.addHandler(ch)
|
||||||
|
|
||||||
# Specalized format for API logging
|
# Specalized format for API logging
|
||||||
logger = logging.getLogger('drydock.control')
|
logger = logging.getLogger(drydock_provisioner.conf.logging.control_logger_name)
|
||||||
logger.propagate = False
|
logger.propagate = False
|
||||||
formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(user)s - %(req_id)s - %(external_ctx)s - %(message)s')
|
formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(user)s - %(req_id)s - %(external_ctx)s - %(message)s')
|
||||||
|
|
||||||
|
@ -43,10 +56,10 @@ def start_drydock():
|
||||||
|
|
||||||
state = statemgmt.DesignState()
|
state = statemgmt.DesignState()
|
||||||
|
|
||||||
orchestrator = orch.Orchestrator(config.DrydockConfig.orchestrator_config.get('drivers', {}),
|
orchestrator = orch.Orchestrator(drydock_provisioner.conf.plugins,
|
||||||
state_manager=state)
|
state_manager=state)
|
||||||
input_ingester = ingester.Ingester()
|
input_ingester = ingester.Ingester()
|
||||||
input_ingester.enable_plugins(config.DrydockConfig.ingester_config.get('plugins', []))
|
input_ingester.enable_plugins(drydock_provisioner.conf.plugins.ingester)
|
||||||
|
|
||||||
return api.start_api(state_manager=state, ingester=input_ingester,
|
return api.start_api(state_manager=state, ingester=input_ingester,
|
||||||
orchestrator=orchestrator)
|
orchestrator=orchestrator)
|
||||||
|
|
|
@ -37,9 +37,14 @@ class Orchestrator(object):
|
||||||
self.logger = logging.getLogger('drydock.orchestrator')
|
self.logger = logging.getLogger('drydock.orchestrator')
|
||||||
|
|
||||||
if enabled_drivers is not None:
|
if enabled_drivers is not None:
|
||||||
oob_drivers = enabled_drivers.get('oob', [])
|
oob_drivers = enabled_drivers.oob_driver
|
||||||
|
|
||||||
|
# This is because oslo_config changes the option value
|
||||||
|
# for multiopt depending on if multiple values are actually defined
|
||||||
|
print("%s" % (oob_drivers))
|
||||||
|
|
||||||
for d in oob_drivers:
|
for d in oob_drivers:
|
||||||
|
print("Enabling OOB driver %s" % d)
|
||||||
if d is not None:
|
if d is not None:
|
||||||
m, c = d.rsplit('.', 1)
|
m, c = d.rsplit('.', 1)
|
||||||
oob_driver_class = \
|
oob_driver_class = \
|
||||||
|
@ -50,7 +55,7 @@ class Orchestrator(object):
|
||||||
self.enabled_drivers['oob'].append(oob_driver_class(state_manager=state_manager,
|
self.enabled_drivers['oob'].append(oob_driver_class(state_manager=state_manager,
|
||||||
orchestrator=self))
|
orchestrator=self))
|
||||||
|
|
||||||
node_driver_name = enabled_drivers.get('node', None)
|
node_driver_name = enabled_drivers.node_driver
|
||||||
if node_driver_name is not None:
|
if node_driver_name is not None:
|
||||||
m, c = node_driver_name.rsplit('.', 1)
|
m, c = node_driver_name.rsplit('.', 1)
|
||||||
node_driver_class = \
|
node_driver_class = \
|
||||||
|
@ -59,7 +64,7 @@ class Orchestrator(object):
|
||||||
self.enabled_drivers['node'] = node_driver_class(state_manager=state_manager,
|
self.enabled_drivers['node'] = node_driver_class(state_manager=state_manager,
|
||||||
orchestrator=self)
|
orchestrator=self)
|
||||||
|
|
||||||
network_driver_name = enabled_drivers.get('network', None)
|
network_driver_name = enabled_drivers.network_driver
|
||||||
if network_driver_name is not None:
|
if network_driver_name is not None:
|
||||||
m, c = network_driver_name.rsplit('.', 1)
|
m, c = network_driver_name.rsplit('.', 1)
|
||||||
network_driver_class = \
|
network_driver_class = \
|
||||||
|
|
|
@ -0,0 +1,46 @@
|
||||||
|
# Copyright 2017 AT&T Intellectual Property. All other rights reserved.
|
||||||
|
#
|
||||||
|
# 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.
|
||||||
|
|
||||||
|
[DEFAULT]
|
||||||
|
# No global options yet
|
||||||
|
|
||||||
|
[logging]
|
||||||
|
log_level = 'DEBUG'
|
||||||
|
|
||||||
|
[authentication]
|
||||||
|
bypass_enabled = True
|
||||||
|
|
||||||
|
[plugins]
|
||||||
|
# All the config ingesters that are active
|
||||||
|
# Supports multiple values
|
||||||
|
ingester = 'drydock_provisioner.ingester.plugins.yaml.YamlIngester'
|
||||||
|
|
||||||
|
# OOB drivers that are enabled
|
||||||
|
# Supports multiple values
|
||||||
|
oob_driver = 'drydock_provisioner.drivers.oob.pyghmi_driver.PyghmiDriver'
|
||||||
|
oob_driver = 'drydock_provisioner.drivers.oob.manual_driver.driver.ManualDriver'
|
||||||
|
|
||||||
|
# Node driver that is enabled
|
||||||
|
node_driver = 'drydock_provisioner.drivers.node.maasdriver.driver.MaasNodeDriver'
|
||||||
|
|
||||||
|
[timeouts]
|
||||||
|
create_network_template = 2
|
||||||
|
identify_node = 10
|
||||||
|
configure_hardware = 30
|
||||||
|
apply_node_networking = 5
|
||||||
|
deploy_node = 45
|
||||||
|
|
||||||
|
[maasdriver]
|
||||||
|
maas_api_url = 'http://localhost:8000/MAAS/api/2.0/'
|
||||||
|
maas_api_key = 'your:secret:key'
|
Loading…
Reference in New Issue