# Copyright (C) 2015 Chintalagiri Shashank
#
# This file is part of Tendril.
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
"""
Generate Production Order Script (``tendril-production``)
=========================================================
This script generates a production order from a provided
``order.yaml`` file.
.. hint::
By default, this script does not register any of its
actions. Call the script with the execute flag in order to
commit the results to the database.
.. hint::
The default order folder this script uses / looks in is in the
production workspace of the tendril instance, typically
``$HOME/.tendril/scratch/production``.
.. warning::
The script relies on the following files to manage serial numbers
when it is run multiple times :
- ``ORDERFOLDER/snomap.yaml``
- ``ORDERFOLDER/wsno``
When the first simulated run is executed, the ``snomap.yaml`` file is
created with dummy serial numbers. In order to then generate and
register a real production order, you should delete the ``snomap.yaml``
file.
The ``wsno`` file is created when an old production order is retrived
using ``tendril-getdox``. This file makes sure if the production order
is regenerated, it uses the same production order serial number.
- When operating on retrieved, old production orders, make sure to not
remove the ``wsno`` file.
- When operating on a new production order, make sure to remove any
stale ``wsno`` files that may be in the workspace from a past run.
.. hint::
It'll probably be easier to simply wipe the entire production order
folder clean when starting work on a new production order. You can
retain the ``order.yaml`` file to use as a template for the new order,
and get rid of everything else.
.. seealso::
:mod:`tendril.production.order`
.. rubric:: Script Usage
.. argparse::
:module: tendril.scripts.production
:func: _get_parser
:prog: tendril-production
:nodefault:
"""
import os
import argparse
from tendril.dox.labelmaker import get_manager
from tendril.utils.config import INSTANCE_ROOT
from tendril.production.order import ProductionOrder
from .helpers import add_base_options
from tendril.utils import log
logger = log.get_logger(__name__, log.DEFAULT)
[docs]def _get_parser():
"""
Constructs the CLI argument parser for the tendril-production script.
"""
parser = argparse.ArgumentParser(
description='Generate production orders and associated documentation.',
prog='tendril-production'
)
add_base_options(parser)
parser.add_argument(
'--order-folder', '-d', metavar='PATH', type=str, nargs='?',
help='Path to the order folder. Search location for order files and '
'write location for output files. Defaults to '
'INSTANCE_FOLDER/scratch/production.'
)
parser.add_argument(
'--order-file', metavar='PATH', type=str, nargs='?',
help='Relative path to the order file (yaml) from the order-folder. '
'Defaults to order.yaml'
)
parser.add_argument(
'--execute', '-e', action='store_true', default=False,
help="Register on the database, publish any/all files. "
"The setting here will override anything in the order file."
)
parser.add_argument(
'--force', '-f', action='store_true', default=None,
help="Force execution. Currently applies to Deltas, bypassing "
"DeltaValidationErrors."
)
parser.add_argument(
'--verbose', '-v', action='store_true', default=None,
help="Increase output verbosity."
)
return parser
[docs]def main(orderfolder=None, orderfile_r=None,
register=None, verbose=True, force=False):
"""
Production order generation function.
"""
if orderfile_r is None:
orderfile_r = 'order.yaml'
if orderfolder is None:
orderfolder = os.path.join(INSTANCE_ROOT, 'scratch', 'production')
orderfile = os.path.join(orderfolder, orderfile_r)
if os.path.exists(os.path.join(orderfolder, 'wsno')):
with open(os.path.join(orderfolder, 'wsno'), 'r') as f:
prod_ord_sno = f.readline().strip()
else:
prod_ord_sno = None
snomap_path = None
if os.path.exists(os.path.join(orderfolder, 'snomap.yaml')):
snomap_path = os.path.join(orderfolder, 'snomap.yaml')
labelmanager = get_manager()
production_order = ProductionOrder(sno=prod_ord_sno)
production_order.create(order_yaml_path=orderfile,
snomap_path=snomap_path,
force=force)
if register is None:
register = False
production_order.process(outfolder=orderfolder, manifestsfolder=None,
label_manager=labelmanager, register=register,
force=force, session=None)
labelmanager.generate_pdfs(orderfolder, force=True)
[docs]def entry_point():
"""
The tendril-production script entry point.
"""
parser = _get_parser()
args = parser.parse_args()
main(orderfolder=args.order_folder,
orderfile_r=args.order_file,
register=args.execute,
verbose=args.verbose,
force=args.force)
if __name__ == '__main__':
entry_point()