This is the C code generator for the DTN Management Architecture (DTNMA). It is part of the larger Asynchronous Network Managment System (ANMS) managed for NASA AMMOS.
( ,&&&.
) .,.&&
( ( \=__/
) ,'-'.
( ( ,, _.__|/ /|
) /\ -((------((_|___/ |
( // | (`' (( `'--|
_ -.;_/ \\--._ \\ \-._/.
(_;-// | \ \-'.\ <_,\_\`--'|
( `.__ _ ___,') <_,-'__,'
`'(_ )_)(_)_)'
This tool uses the YANG representation of an Application Data Model (ADM) to generate code for various purposes. CAmp generates:
Please contact the developers for more information or suggestions. The Architecture Section also provides some explanation of the components of CAmp, and how to incorporate additional generators.
NOTE CAmp largely assumes that the ADM YANG input can be trusted (i.e., CAmp does not go to great lengths to fully sanitize all strings found within the ADM). CAmp does properly escape necessary sequences found in the ADMs tested during development (e.g., apostrophes in object descriptions).
To install development and test dependencies for this project, run from the root directory (possibly under sudo if installing to the system path):
pip3 install -r <(python3 -m piptools compile --extra test pyproject.toml 2>&1)
To install the project itself from source run:
pip3 install .
camp -h
The camp tool takes a YANG representation of an ADM for a network protocol as input and calls each of the included generators to generate files for the ADM.
For information on how to format a YANG ADM, please consult the Application Management Model IETF draft.
Given the YANG representation of the ADM, run camp with:
camp <adm.yang>
If you're generating files for a new ADM, you may see an error similar to the following:
[Error] this ADM is not present in the name registry. Pass integer value via
command line or set manually in name_registry.cfg
This is because the name of the ADM is not yet present in the camp Name
Registry. To solve this, pass the nickname value for the ADM to camp via the
-n
command line option:
camp <adm.json> -n <value>
You can also use the -n
option to make camp use a different nickname for an
ADM that is present in the camp Name Registry. For example,
camp bp_agent.json -n 23
Will generate bp_agent files with a nickname of 23
instead of the registered
value of 2
. To make these changes permanent (or to add a new ADM to the
name registry), pass the -u
flag to camp:
camp <adm.json> -n <value> -u
During a successful camp execution, output similar to the following will be printed to STDOUT.
Loading <path_to_json_file>/<adm.json> ...
[ DONE ]
Generating files ...
Working on .//ace/adm_<adm>.json [ DONE ]
Working on .//agent/adm_<adm>_impl.h [ DONE ]
Working on .//agent/adm_<adm>_impl.c [ DONE ]
Working on .//adm_<adm>.sql [ DONE ]
Working on .//shared/adm_<adm>.h [ DONE ]
Working on .//mgr/adm_<adm>_mgr.c [ DONE ]
Working on .//agent/adm_<adm>_agent.c [ DONE ]
[ End of CAmpPython Execution ]
This output shows that camp completed a successful generation of each of the files listed. If they don't already exist, camp will create the following directories in the current directory:
and put generated files into the appropriate created directory. Use the -o
flag with camp to redirect output to a different directory.
camp <adm.json> -o <output_directory>
If the path at
Camp will not delete any existing directory structure, but files present in the output directories with the same name as generated files will be overwritten.
The adm_<adm>_impl.c
and adm_<adm>_impl.h
files generated for the DTNMA agent
contain functions whose bodies cannot be automatically generated with knowledge
of the ADM alone. When generated, these fuctions are marked with tags similar to
the following:
/*
* +----------------------------------------------------------------------+
* |START CUSTOM FUNCTION <function_name> BODY
* +----------------------------------------------------------------------+
*/
/*
* +----------------------------------------------------------------------+
* |STOP CUSTOM FUNCTION <function_name> BODY
* +----------------------------------------------------------------------+
*/
Additionally, the user may wish to add additional custom functions and/or header files to these generated files. To allow re-generation of camp files with minimal re-work for custom code in these files, camp has a 'roundtripping' feature that allows preservation of these custom additions in subsequent file generations.
The roundtripping feature in camp will save any code in the file that falls between camp custom tags, and will add it to the newly-generated version of the file. Example usage:
camp <adm.json> -c <path_to_existing_impl.c> -h <path_to_existing_impl.h>
The resulting generated impl.c and impl.h files will contain the custom code from the impl.c and impl.h files passed to camp.
Current acceptable custom tags are:
/* [START|STOP] CUSTOM INCLUDES HERE */
)/* [START|STOP] CUSTOM FUNCTIONS HERE */
)For custom function bodies, the
To add a new generator to camp, create a python script that creates the file
and add it to the CAmpPython/generators/
directory. Then, in CAmpPython.py,
import the new generator and add it to the file generation code of the main()
function (starting at line 105).
All generators should:
create()
method as their main function, which takes as its first
and second argument:
create()
function (the generator may choose to make a sub-directory
in the output directory)To contribute to this project, through issue reporting or change requests, see the CONTRIBUTING document.