From ba6d6a702c4524ba14cbb8228b029e7deb6f3be7 Mon Sep 17 00:00:00 2001 From: Aaron Helsinger Date: Thu, 3 Dec 2015 14:29:53 -0500 Subject: [PATCH 01/27] initial version of omni design notes md file --- doc/omni-design-notes.md | 380 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 380 insertions(+) create mode 100644 doc/omni-design-notes.md diff --git a/doc/omni-design-notes.md b/doc/omni-design-notes.md new file mode 100644 index 00000000..efc4a568 --- /dev/null +++ b/doc/omni-design-notes.md @@ -0,0 +1,380 @@ +# Contents +## Source code & scripts: +acceptance_tests/AM_API: scripts for developers to test an aggregate's + compliance with the GENI AM API +src/: Put this directory on your PYTHONPATH + gcf-*.py: Run GCF reference aggregate, clearinghouse, etc. + omni.py + stitcher.py + omni-configure.py + delegateSliceCred.py + omni_log_conf_sample.conf + gcf/ + geni/: Utilities particularly for the GCF tree + am/: AM API samples + am2.py: APIv2 reference aggregate + am3.py: APIv3 reference aggregate + am_method_context.py: authorization wrapper around method + calls + aggregate.py, fakevm.py, resource.py: Model key pieces in a + simple way + auth/: Authorization module (see README-authorization.txt) + util/: Utilities + cert_util: Define create_cert + cred_util: Methods to create and validate credentials, doing + authorization + secure_xmlrpc_client.py: A client that IDs with a cert over + SSL using PyOpenSSL + speaksfor_util.py: Utilities to generate and validate a speaks + for (ABAC) credential. Has a main for commandline + operations. + urn_util: Utilities for manipulating URNs, transforming + to/from public ID, validating + SecureXMLRPCServer.py: A python XML-RPC server that requires a + client certificate. Used by the reference AM and CH + SecureThreadedXMLRPCServer.py: This threaded variant has + issues. See Github. + ch.py: Sample Clearinghouse. Not Uniform Federation API + compliant. + am1.py: AM APIv1 reference AM + ca.py: Test CA for generating user and aggregate certs. + + omnilib/: Omni + frameworks/: Code for talking to different kinds of + clearinghouses. Used by chhandler.py + framework_base.py: Base class + framework_chapi.py: Talking to Uniform Federation API (GENI Clearinghouse) + framework_gcf.py: Talk to reference GCF CH + framework_pg.py: Talk natively to ProtoGENI + framework_sfa.py: Talk to SFA Slice Authority + stitch/: Support code for Stitcher + util/: + credparsing.py: Utilities to parse credentials and distinguish + between XML credentials and JSON wrapped credentials (wrapped + as a struct giving type, version, and value) + dates.py: Define naiveUTC for ensuring all dates internally + are naive (no timezone) and are in UTC. + dossl.py: Wrapper for SSL calls to handle common errors, + retrying if reasonable. Retry on an error code meaning the + server is busy up to 4 times. Allow retrying when user mistypes + their SSL passphrase. Detect and prettify some common SSL + error codes. + json_encoding: Ensure datetimes are properly encoded in JSON + omnierror.py: Define OmniError and AMAPIError + handler_utils.py: Handle aggregate nicknames and URN/URL + lookups, RSpec nickname lookups, getting the list of aggregates + to operate on, loading/saving/retreiving credentials, + constructing filenames, formatting results for saving and + printing/saving results, and getting sliver/reservation expiration + from manifest RSpecs and sliverstatus + xmlrpc/client.py: PyOpenSSL XMLRPC client that authenticates + with a certificate. See geni/util/secure_xmlrpc_client.py for + duplicate code. + handler.py: Depending on the call, Omni calls are dispatched to + a handler. This is the base class. + amhandler.py: Handle all AM API calls (like createsliver) + chhandler.py: Handle calls to a clearinghouse (like createslice) + stitchhandler.py: Handle stitching calls + sfa/: Code imported from SFA. Defines Certificates and Credentials + and how to validate them. + gcf_version.py: Define the current Omni version + oscript.py: Main for Omni. See `call()` and `main()`. + stitcher_logging.conf: Python Logging config file for Stitcher + stitcher_logging_deft.py: Alternate stitcher configuration if the + .conf file is not found (can happen on Windows) +examples/: Some examples and useful scripts + readyToLogin.py + addMemberToSliceAndSlivers.py + renewSliceAndSlivers.py + +## Various READMEs, some in GitHub markdown format, some in Trac wiki format: +doc/ +CHANGES +CONTRIBUTING.md +CONTRIBUTORS.md +INSTALL*.* +LICENSE.txt +README-*.txt +README.md +README.txt + +## Sample configuration files: +gcf_config.sample +omni_config.sample + +## Files for building RPMs. See README-packaging.md: +Makefile.am +autogen.sh +configure.ac +geni-tools.spec +debian/ + +## Test and config files for older modules: +stitcherTestFiles/ +gib-config-files/ +gib-rspec-examples/ + +## Files for building binaries: +mac_install/ +windows_install/ +doc/CreatingBinaries.md + +## Mapping of Aggregate nicknames to URN and URL. Latest version +is posted to the Omni wiki for automatic download by Omni, but version +controlled here. +agg_nick_cache.base + +# Omni +Omni is the command line tool for reserving resources from GENI +Aggregate Manager API compliant resource providers. It also supports +managing projects and slices from Uniform Federation API compliant +clearinghouses. +It is used for talking to aggregates by the GENI Portal and GENI +Desktop. Key functions are used by geni-lib. It underlies the Sticher +tool for creating stitched topologies, which is used by CloudLab to +reserve topologies that span multiple CloudLab sites. +For a user's guide to Omni, see README-omni.txt + +Multiple sample and useful scripts that use Omni are in the +`examples/` directory. Otherwise all main code is under `src/`. + +geni-tools code is structured to make it easier to import it in other +tools. Set PYTHONPATH to the `src` directory. To ease this, files use +relative imports. See for example speaksfor_util.py which uses a +try/except to use relative imports by preference, but allow for +running this file's main directly with absolute imports. For similar +reasons, Omni has all its main code in src/gcf/oscript.py +rather than directly in omni.py. Stitcher should be refactored +similarly, but has not been. + +Omni calls are handled by a special "handler"; handler.py dispatches +to chhandler or amhandler (and Stitcher uses a parallel stitchhandler +for future smoother integration). The handler allows invoking any +method in the handler classes (excluding private methods, indicated by +a name that starts with "_"). Handlers do two kinds of operations: +Call a clearinghouse using a 'framework' (to create a slice or get a credential for +example), and calls to an aggregate. Omni supports multiple +clearinghouse APIs, whose differences are abstracted away with a +'framework' whose API is defined in framework_base.py. The framework +handles getting the user and slice credentials. Additionally, in AM +APIv3 credentials are a struct that indicates the type and version of +the actual credential. The framework handles wrapping and unwrapping +the actual credential as needed. The specific framework to use is inferred dynamically based on the +`omni_config` file. frameworks are named `framework_.py`, using the `type` from the selected framework section of +the `omni_config`. `framework_chapi` supports the Uniform Federation +API v1 and v2. Currently it hard codes some assumptions that should be +done dynamically using information from `GetVersion` (like whether the +CH supports projects). + +`chhandler` supports calls to the clearinghouse: get a user or slice +credential, create or renew a slice, list aggregates, list a user's +slices or projects, etc. Each call parses the commandline arguments +(not options) itself. Calls to the proper framework to do the +clearinghouse call are typically wrapped in _do_ssl to support +automatic retry. + +`amhandler` supports calls to aggregates, including all AM APIv2, v2, +v3, and adopted v4 calls. In addition, a number of aggregate specific +calls are supported. Each call parses the arguments itself (e.g. to +get out the slice name), and calls to the aggregate itself are wrapped +in _do_ssl. The amhandler tries to auto-correct the AM API version in +use, taking into account the requested AM API version and what version +of the AM API is supported at the aggregate(s) being contacted. It may +adjust the API version, or adjust the URL at which it contacts the +aggregate, to use a different AM API version. To do this, it uses the +information from the GetVersion call, which it caches. In order to +determine which aggregates to call, it uses a combination of the `-a` +argument(s), the aggregates listed as used by the given slice at the +clearinghouse (in the sliver_info structure), and aggregates specified +in the omni_config file. To allow this to work, Omni must have a +record of the mapping of aggregate URNs and nicknames to URLs and vice +versa. Soem of this is available at the clearinghouse, but Omni +primarily uses the Aggregate nickname cache, which it updates daily +from a central server. + +Handlers share a few common elements. Omni errors extend the OmniError +class. Handlers log the error and re-raise the error, including the AM +API error return triple if available. All public methods return a list +of 2 elements: a pretty string to describe the result, and an object +that is the return value. The type of the return value depends on the +specific method call. Within Omni, all timestamps are assumed to be in +UTC but do not have an explicit timezone (naive +timestamps). Timestamps are converted to assure this remains +true. + +Many common functions are handled by methods in +handler_utils. handler_utils contains methods for loading and saving +credentials, for saving command output to a file or printing it as +specified by the options, for getting the list of aggregates, and for +looking up aggregates or nicknames in the aggregate nickname +cache. + +Omni keeps a cache of aggregate nicknames, by default in +~/.gcf/agg_nick_cache. This INI format file maps nicknames to +aggregate URL and URN. Note that the same URN may have multiple URLs +(different AM API versions typically), and the same URL could have +multiple nicknames. The cache is maintained in git and posted on the +Omni wiki. Omni downloads the cache once daily. Nicknames in the cache +are ordered by convention with AM API agnostic nicknames before those +specific to a version, and then by API version number. Nicknames are +typically -[version#], e.g. "moxi-of1". For some purposes, +Omni takes a nickname and looks up the aggregate URN and URL. For +other purposes, Omni starts with a URL or URN and looks up the +nickname for prettier log messages. When doing so, Omni uses some +heuristics for choosing among nicknames that share the same URN or +URL. For example, Omni ignores http vs https in the URL, and Omni prefers +a shorter nickname and one that lists the AM type after the site. Note +that these heuristics are brittle, and hard code the possible strings +to name an AM type. The only risk however is picking an uglier +nickname. Note also that the agg_nick_cache must be kept +up-to-date. In particular, when omni users use the +--useSliceAggregates option, it uses the sliver_info records at the +clearinghouse to get AM URNs that are registered as having resources +on this slice. Then Omni must look up a URL for that URN, and uses the +agg_nick_cache to do so. Therefore, any AM that is not listed in the +agg_nick_cache will not be included in Omni operations that use --useSliceAggregates. + +handler_utils also provides the `_listaggregates` function for getting +a list of aggregates to operate on. First, it handles the +--useSliceAggregates option. HOWEVER, this only makes sense if there +is a slice to operate on and which will have existing sliver_info +records. Therefore, in amhandler, the _handle function calls +`_extractSliceArg(args)`, which extracts the slice name argument from +the given commandline arguments. However, this function carefully +excludes method calls that do not provides a slice name, or for which +there would not yet be sliver info records or the records would not be +useful; when calling createsliver, you do not want to reserve +resources at the AMs where there is already a reservation, as that +will fail. +Given the slice name, _listaggregates gets the AM URNs from teh +sliver_info records at the clearinghouse, if possible (only at CHAPI +compatible clearinghouses). Omni then retrieves the AM URL and +nickname if possible, avoiding duplicate entries. +If the options do not require using the sliver_info records, then Omni +considers the `-a` options, again looking up the url and urn for the +aggregate nickname (or urn or url). Failing that, Omni uses the +`aggregates` section of the omni_config file. If that fails, Omni asks +the clearinghouse for _all_ aggregates. Except for the explicit CH +call to list all aggregates, this is usually the wrong thing. + +handler_utils also provides functions for manipulating +credentials. Omni can save a slice or user credential, or a speaks for +credential, and then load it for use in AM or CH calls. `_load_cred` +handles reading JSON (APIv3) or XML (APIv2 or v1) +credentials. `_get_slice_cred` tries to read any saved credential in +the file specified by --slicecredfile, otherwise it asks the +clearinghouse for the slice credential, wrapping or unwrapping the +credential in JSON as needed. `_save_cred` writes the proper JSON or +XML file. + +handler_utils also provides helpers for printing or saving call +results, to STDOUT, the logger, a JSON file, or an XML file, as +appropriate, based on the data type and the options. The main method for this is `_printResults`. + +amhandler includes a large number of helper functions to support it's +operations and simplify the individual methods. +BadClientException +GetVersionCache +self.clients +self._extractSliceArg +self._correctAPIVersion +self._api_call +self._getclients() +self._retrieve_value +self._args_to_slicecred +self._build_options +v2 vs v3 functions +self._build_urns + +sliver_info stuff +amhandler sliver result parsing functions +opts.devmode + +* handlers (reference the AM API and CH specs) +* omni as library (oscript, imports, ...) +* logging (options, config, tricks to edit the handlers, ...) +* frameworks (for CH, baseclass, use of handler_utils) +* get version cache (why, how used, optinos to control use, known +issues) +* AM nick cache (why, how used, options, downloading new one, operator +must upload new one, who decides what goes in here, ordering entries, +key methods in handler_utils, finding URNs for URLs or nicknames, +finding shortest nickname, use with sliver_info, uglinesses +* sliver info: with GENI CH, where used, use of AM nick cache, +* saved user and slice creds +* m2crypto vs pyopenssl vs ?, managing ssl versions and ciphers, +passing chained certs issues, the secure server/client classes +* do_ssl (errors it wraps, retries, errors it suppresses) +* AM method return struct (keeping it common) +* output control options and their interaction +* todo items (summarize tix, code cleanup, pure API call versions, ?) +* show create sliver pseudo code to walk much of the sub systems +* ? + +# stitcher +* SCS + * where to find docs and code, who runs it (contact), who maintains + it (contact) + * running scs.py + * avail commands and their returns + * what is in the SCS and who controls + * error modes + * how stitcher uses it + * options/inputs that control when/how it is used + +* AL2S + * What it is and how it is used + * who runs/maintains (contact) + * where to find code + * OESS + +* stitchhandler, launcher, objects.py +* pseudo code control flow +* logging +* use of omni via omni.call + * alternatives with more direct calls + * funniness messing with loggers to suppress some calls +* workflow parsing and how workflow is calculated/used +* developer options +* to do items + * factor so can use as library + * factor so can add other things to workflow, other dependencies + * extract out AM specifics more + * refactoring for managability / maintainability + + +# tools + +# gcf +* What it is +* m2crypto vs pyopenssl +* following the AM API (shortcomings) + * gram +* doesn't follow the federation API but should +* gcf-test +* using with omni +* cred_utils and speaks for + * how it is used, what it does, what it doesn't do + +authorization engine +* point to readme +* docs on why + +scheduling support +* point to readme + +acceptance +* what it is, where it is, pointers to using it +* incomplete +* doesn't do v3 + +# SFA +- we use some of their files. See src/gcf/sfa. +Thierry Parmentelat +Tony Mack +- Start at merging latest is here: https://github.com/ahelsing/geni-tools/tree/tkt854-newsfa +- credential.xsd really should be posted by geni.net, but +isn't. Unclear what the trust/verification effect would be of a +change. Note that it would require changing the namespace. +http://git.planet-lab.org/?p=sfa.git From 02211249be3ecc5f4bf8074ad3fb5cabc6f6345d Mon Sep 17 00:00:00 2001 From: Aaron Helsinger Date: Thu, 3 Dec 2015 14:39:21 -0500 Subject: [PATCH 02/27] md formatting cleanup for omni-design-notes --- doc/omni-design-notes.md | 43 ++++++++++++++++++++++++---------------- 1 file changed, 26 insertions(+), 17 deletions(-) diff --git a/doc/omni-design-notes.md b/doc/omni-design-notes.md index efc4a568..f42c7ee5 100644 --- a/doc/omni-design-notes.md +++ b/doc/omni-design-notes.md @@ -1,5 +1,6 @@ # Contents ## Source code & scripts: +``` acceptance_tests/AM_API: scripts for developers to test an aggregate's compliance with the GENI AM API src/: Put this directory on your PYTHONPATH @@ -86,8 +87,9 @@ examples/: Some examples and useful scripts readyToLogin.py addMemberToSliceAndSlivers.py renewSliceAndSlivers.py - +``` ## Various READMEs, some in GitHub markdown format, some in Trac wiki format: +``` doc/ CHANGES CONTRIBUTING.md @@ -97,32 +99,40 @@ LICENSE.txt README-*.txt README.md README.txt +``` ## Sample configuration files: +``` gcf_config.sample omni_config.sample +``` ## Files for building RPMs. See README-packaging.md: +``` Makefile.am autogen.sh configure.ac geni-tools.spec debian/ +``` ## Test and config files for older modules: +``` stitcherTestFiles/ gib-config-files/ gib-rspec-examples/ +``` ## Files for building binaries: +``` mac_install/ windows_install/ doc/CreatingBinaries.md - -## Mapping of Aggregate nicknames to URN and URL. Latest version -is posted to the Omni wiki for automatic download by Omni, but version +``` +## Mapping of Aggregate nicknames to URN and URL. +Latest version is posted to the Omni wiki for automatic download by Omni, but version controlled here. -agg_nick_cache.base +`agg_nick_cache.base` # Omni Omni is the command line tool for reserving resources from GENI @@ -143,7 +153,7 @@ tools. Set PYTHONPATH to the `src` directory. To ease this, files use relative imports. See for example speaksfor_util.py which uses a try/except to use relative imports by preference, but allow for running this file's main directly with absolute imports. For similar -reasons, Omni has all its main code in src/gcf/oscript.py +reasons, Omni has all its main code in `src/gcf/oscript.py` rather than directly in omni.py. Stitcher should be refactored similarly, but has not been. @@ -151,7 +161,7 @@ Omni calls are handled by a special "handler"; handler.py dispatches to chhandler or amhandler (and Stitcher uses a parallel stitchhandler for future smoother integration). The handler allows invoking any method in the handler classes (excluding private methods, indicated by -a name that starts with "_"). Handlers do two kinds of operations: +a name that starts with `_`). Handlers do two kinds of operations: Call a clearinghouse using a 'framework' (to create a slice or get a credential for example), and calls to an aggregate. Omni supports multiple clearinghouse APIs, whose differences are abstracted away with a @@ -160,8 +170,7 @@ handles getting the user and slice credentials. Additionally, in AM APIv3 credentials are a struct that indicates the type and version of the actual credential. The framework handles wrapping and unwrapping the actual credential as needed. The specific framework to use is inferred dynamically based on the -`omni_config` file. frameworks are named `framework_.py`, using the `type` from the selected framework section of +`omni_config` file. frameworks are named `framework_.py`, using the `type` from the selected framework section of the `omni_config`. `framework_chapi` supports the Uniform Federation API v1 and v2. Currently it hard codes some assumptions that should be done dynamically using information from `GetVersion` (like whether the @@ -211,14 +220,14 @@ looking up aggregates or nicknames in the aggregate nickname cache. Omni keeps a cache of aggregate nicknames, by default in -~/.gcf/agg_nick_cache. This INI format file maps nicknames to +`~/.gcf/agg_nick_cache`. This INI format file maps nicknames to aggregate URL and URN. Note that the same URN may have multiple URLs (different AM API versions typically), and the same URL could have multiple nicknames. The cache is maintained in git and posted on the Omni wiki. Omni downloads the cache once daily. Nicknames in the cache are ordered by convention with AM API agnostic nicknames before those specific to a version, and then by API version number. Nicknames are -typically -[version#], e.g. "moxi-of1". For some purposes, +typically `-[version#]`, e.g. "moxi-of1". For some purposes, Omni takes a nickname and looks up the aggregate URN and URL. For other purposes, Omni starts with a URL or URN and looks up the nickname for prettier log messages. When doing so, Omni uses some @@ -229,17 +238,17 @@ that these heuristics are brittle, and hard code the possible strings to name an AM type. The only risk however is picking an uglier nickname. Note also that the agg_nick_cache must be kept up-to-date. In particular, when omni users use the ---useSliceAggregates option, it uses the sliver_info records at the +`--useSliceAggregates` option, it uses the sliver_info records at the clearinghouse to get AM URNs that are registered as having resources on this slice. Then Omni must look up a URL for that URN, and uses the agg_nick_cache to do so. Therefore, any AM that is not listed in the -agg_nick_cache will not be included in Omni operations that use --useSliceAggregates. +agg_nick_cache will not be included in Omni operations that use `--useSliceAggregates`. handler_utils also provides the `_listaggregates` function for getting a list of aggregates to operate on. First, it handles the ---useSliceAggregates option. HOWEVER, this only makes sense if there +`--useSliceAggregates` option. HOWEVER, this only makes sense if there is a slice to operate on and which will have existing sliver_info -records. Therefore, in amhandler, the _handle function calls +records. Therefore, in amhandler, the `_handle` function calls `_extractSliceArg(args)`, which extracts the slice name argument from the given commandline arguments. However, this function carefully excludes method calls that do not provides a slice name, or for which @@ -247,7 +256,7 @@ there would not yet be sliver info records or the records would not be useful; when calling createsliver, you do not want to reserve resources at the AMs where there is already a reservation, as that will fail. -Given the slice name, _listaggregates gets the AM URNs from teh +Given the slice name, `_listaggregates` gets the AM URNs from teh sliver_info records at the clearinghouse, if possible (only at CHAPI compatible clearinghouses). Omni then retrieves the AM URL and nickname if possible, avoiding duplicate entries. @@ -263,7 +272,7 @@ credentials. Omni can save a slice or user credential, or a speaks for credential, and then load it for use in AM or CH calls. `_load_cred` handles reading JSON (APIv3) or XML (APIv2 or v1) credentials. `_get_slice_cred` tries to read any saved credential in -the file specified by --slicecredfile, otherwise it asks the +the file specified by `--slicecredfile`, otherwise it asks the clearinghouse for the slice credential, wrapping or unwrapping the credential in JSON as needed. `_save_cred` writes the proper JSON or XML file. From 92d5191e39942127025073087aa50f41ad06d9cd Mon Sep 17 00:00:00 2001 From: Aaron Helsinger Date: Mon, 7 Dec 2015 16:31:24 -0500 Subject: [PATCH 03/27] say more in a comment --- src/gcf/omnilib/amhandler.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/gcf/omnilib/amhandler.py b/src/gcf/omnilib/amhandler.py index e0e04752..8e2951fa 100644 --- a/src/gcf/omnilib/amhandler.py +++ b/src/gcf/omnilib/amhandler.py @@ -6179,7 +6179,7 @@ def _build_options(self, op, slicename, options): self.logger.warn("Got geni_end_time for method %s but using anyhow", op) time = datetime.datetime.max try: - # noSec=True so that fractional seconds are dropped + # noSec=True so that fractional seconds are dropped (which can break at PG AMs, or could) (time, time_with_tz, time_string) = self._datetimeFromString(self.opts.geni_end_time, name=slicename, noSec=True) options["geni_end_time"] = time_string except Exception, exc: From fc18eb46155ea4e573c8dbecf8a17e8a8a36a404 Mon Sep 17 00:00:00 2001 From: Aaron Helsinger Date: Mon, 7 Dec 2015 16:31:36 -0500 Subject: [PATCH 04/27] adding a bunch more notes --- doc/omni-design-notes.md | 219 +++++++++++++++++++++++++++++++-------- 1 file changed, 175 insertions(+), 44 deletions(-) diff --git a/doc/omni-design-notes.md b/doc/omni-design-notes.md index f42c7ee5..4a964050 100644 --- a/doc/omni-design-notes.md +++ b/doc/omni-design-notes.md @@ -1,4 +1,8 @@ -# Contents +This file contains some notes on the design and implementation of Omni. Many details are in the issues or the source code. This document may serve as a pointer, or explanation for the code you are reading. + +This document has many holes and needs polishing. + +# Directory Contents ## Source code & scripts: ``` acceptance_tests/AM_API: scripts for developers to test an aggregate's @@ -55,7 +59,7 @@ src/: Put this directory on your PYTHONPATH as a struct giving type, version, and value) dates.py: Define naiveUTC for ensuring all dates internally are naive (no timezone) and are in UTC. - dossl.py: Wrapper for SSL calls to handle common errors, + dossl.py: Provide the _do_ssl wrapper for SSL calls to handle common errors, retrying if reasonable. Retry on an error code meaning the server is busy up to 4 times. Allow retrying when user mistypes their SSL passphrase. Detect and prettify some common SSL @@ -150,7 +154,7 @@ Multiple sample and useful scripts that use Omni are in the geni-tools code is structured to make it easier to import it in other tools. Set PYTHONPATH to the `src` directory. To ease this, files use -relative imports. See for example speaksfor_util.py which uses a +relative imports. See for example `speaksfor_util.py` which uses a try/except to use relative imports by preference, but allow for running this file's main directly with absolute imports. For similar reasons, Omni has all its main code in `src/gcf/oscript.py` @@ -172,7 +176,7 @@ the actual credential. The framework handles wrapping and unwrapping the actual credential as needed. The specific framework to use is inferred dynamically based on the `omni_config` file. frameworks are named `framework_.py`, using the `type` from the selected framework section of the `omni_config`. `framework_chapi` supports the Uniform Federation -API v1 and v2. Currently it hard codes some assumptions that should be +API v1 and v2 (http://groups.geni.net/geni/wiki/CommonFederationAPIv2). Currently it hard codes some assumptions that should be done dynamically using information from `GetVersion` (like whether the CH supports projects). @@ -180,14 +184,14 @@ CH supports projects). credential, create or renew a slice, list aggregates, list a user's slices or projects, etc. Each call parses the commandline arguments (not options) itself. Calls to the proper framework to do the -clearinghouse call are typically wrapped in _do_ssl to support +clearinghouse call are typically wrapped in `_do_ssl` to support automatic retry. `amhandler` supports calls to aggregates, including all AM APIv2, v2, -v3, and adopted v4 calls. In addition, a number of aggregate specific +v3, and adopted v4 calls (http://groups.geni.net/geni/wiki/GAPI_AM_API). In addition, a number of aggregate specific calls are supported. Each call parses the arguments itself (e.g. to get out the slice name), and calls to the aggregate itself are wrapped -in _do_ssl. The amhandler tries to auto-correct the AM API version in +in `_do_ssl`. The amhandler tries to auto-correct the AM API version in use, taking into account the requested AM API version and what version of the AM API is supported at the aggregate(s) being contacted. It may adjust the API version, or adjust the URL at which it contacts the @@ -198,7 +202,7 @@ argument(s), the aggregates listed as used by the given slice at the clearinghouse (in the sliver_info structure), and aggregates specified in the omni_config file. To allow this to work, Omni must have a record of the mapping of aggregate URNs and nicknames to URLs and vice -versa. Soem of this is available at the clearinghouse, but Omni +versa. Some of this is available at the clearinghouse, but Omni primarily uses the Aggregate nickname cache, which it updates daily from a central server. @@ -224,7 +228,7 @@ Omni keeps a cache of aggregate nicknames, by default in aggregate URL and URN. Note that the same URN may have multiple URLs (different AM API versions typically), and the same URL could have multiple nicknames. The cache is maintained in git and posted on the -Omni wiki. Omni downloads the cache once daily. Nicknames in the cache +Omni wiki (currently at http://trac.gpolab.bbn.com/gcf/raw-attachment/wiki/Omni/agg_nick_cache). Omni downloads the cache once daily (configurable). Nicknames in the cache are ordered by convention with AM API agnostic nicknames before those specific to a version, and then by API version number. Nicknames are typically `-[version#]`, e.g. "moxi-of1". For some purposes, @@ -232,17 +236,18 @@ Omni takes a nickname and looks up the aggregate URN and URL. For other purposes, Omni starts with a URL or URN and looks up the nickname for prettier log messages. When doing so, Omni uses some heuristics for choosing among nicknames that share the same URN or -URL. For example, Omni ignores http vs https in the URL, and Omni prefers +URL. For example, Omni ignores `http` vs `https` in the URL, and Omni prefers a shorter nickname and one that lists the AM type after the site. Note that these heuristics are brittle, and hard code the possible strings to name an AM type. The only risk however is picking an uglier -nickname. Note also that the agg_nick_cache must be kept +nickname. Note also that the `agg_nick_cache` must be kept up-to-date. In particular, when omni users use the `--useSliceAggregates` option, it uses the sliver_info records at the clearinghouse to get AM URNs that are registered as having resources on this slice. Then Omni must look up a URL for that URN, and uses the agg_nick_cache to do so. Therefore, any AM that is not listed in the -agg_nick_cache will not be included in Omni operations that use `--useSliceAggregates`. +agg_nick_cache will not be included in Omni operations that use `--useSliceAggregates`. GENI operations must keep the `agg_nick_cache` up to date with the proper AM URLs and list the proper aggregates, to ensure sliver info reporting, availability of reasonable nicknames, and reasonable Omni printouts. Generally, any aggregate that conforms to the AM API and provides reservable resources could be listed in the cache, but GENI policy may require additional testing (reliability for example). +Note that there are options for controlling where the cache is saved, and options to force not attempting to download a new cache at all. handler_utils also provides the `_listaggregates` function for getting a list of aggregates to operate on. First, it handles the @@ -256,7 +261,7 @@ there would not yet be sliver info records or the records would not be useful; when calling createsliver, you do not want to reserve resources at the AMs where there is already a reservation, as that will fail. -Given the slice name, `_listaggregates` gets the AM URNs from teh +Given the slice name, `_listaggregates` gets the AM URNs from the sliver_info records at the clearinghouse, if possible (only at CHAPI compatible clearinghouses). Omni then retrieves the AM URL and nickname if possible, avoiding duplicate entries. @@ -279,39 +284,165 @@ XML file. handler_utils also provides helpers for printing or saving call results, to STDOUT, the logger, a JSON file, or an XML file, as -appropriate, based on the data type and the options. The main method for this is `_printResults`. +appropriate, based on the data type and the options. The main method for this is `_printResults`. That function +tries hard to add a "header" to the file in a way that makes the file still valid xml or json. It is often used in +conjunction with `_writeRSpec`, which gets the RSpec in proper format and gets a header string, constructs +a filename for saving the rspec using `_construct_output_filename`, and then calls `_printResults`. +`_construct_output_filename` uses several helpers to pull a server name out of AM URN or URL, +extract out the meaningful bits, remove bad characters, and then create a filename +based on that name. -amhandler includes a large number of helper functions to support it's +amhandler includes a large number of helper functions to support its operations and simplify the individual methods. -BadClientException -GetVersionCache -self.clients -self._extractSliceArg -self._correctAPIVersion -self._api_call -self._getclients() -self._retrieve_value -self._args_to_slicecred -self._build_options -v2 vs v3 functions -self._build_urns - -sliver_info stuff -amhandler sliver result parsing functions -opts.devmode - -* handlers (reference the AM API and CH specs) -* omni as library (oscript, imports, ...) -* logging (options, config, tricks to edit the handlers, ...) -* frameworks (for CH, baseclass, use of handler_utils) -* get version cache (why, how used, optinos to control use, known -issues) -* AM nick cache (why, how used, options, downloading new one, operator -must upload new one, who decides what goes in here, ordering entries, -key methods in handler_utils, finding URNs for URLs or nicknames, -finding shortest nickname, use with sliver_info, uglinesses -* sliver info: with GENI CH, where used, use of AM nick cache, -* saved user and slice creds +* BadClientException +This helper exception is used to signal that Omni called an AM that spoke the wrong version of the AM API, or +is otherwise not callable (see `self._api_call`). Then the calling methods (e.g. `Describe`) can note +the failure in the return message, bail if that's the only AM, or continue to the next aggregate. + +* GetVersion Cache +In order to call each AM with the proper API version (or call the right URL for an AM), Omni uses the return from GetVersion. +Rather than call GetVersion on nearly every call, Omni caches the result of GetVersion for use between Omni invocations. +There are multiple options for controlling how long the cache is good for, where it is, or whether to use it at all. `amhandler` +has many helper functions for retrieving `GetVersion` values, using the cache if available, or otherwise actually +calling GetVersion, and caching the result (including any error return). Note that Omni calls GetVersion twice when the user invokes GetVersion explicitly. + +* `self.clients` +A list of XMLRPC client objects, one per aggregate that the call should be run at. The entries are corrected to point to the right URL by `self._correctAPIVersion`. The veriable is filled in by self._getclients(). That method first calls `handler_utils._listaggregates` +to get the right list of aggregates. Then an XMLRPC client is created for each. The client object is marked up with a +nickname (using `handler_utils._lookupAggNick`) and a pretty string for printing out the contact. +`self._getclients()` is called by each method. + +* `self._extractSliceArg` +Get the slice name for use by `handler_utils._listaggregates` in finding the aggregates on which to operate. +Called by the `_handle` function, get the the slice name out of the commandline arguments. +This function knows which methods take a slice name (or URN), but also which are called on a slice that could conceivably +have `sliver_info` records at the clearinghouse, and such could give a list of aggregates at the clearinghouse to operate on. +The fact that this knows about the individual method calls is ugly / fragile. + +* `self._correctAPIVersion` +Omni users will often invoke Omni with a generic nickname (`gpo-ig`) or URL, disregarding which version of the AM API they are +invoking. They may also easily forget to supply the `-V3` argument when that was intended. This function +attempts to correct for these mistakes. This function first ensures that all clients are reachable, dropping +those that are not. Then it figures out which AM API version most AMs talk. It then auto corrects which version of the AM API +it uses. Later, Omni will change individual clients to use a different URL to match the desired AM API version as needed (see `_checkValidClient and how it is called from `_api_call`). + +* `self._api_call` +This function wraps calls to the XMLRPC AM clients. First it ensures that the client exists and speaks the correct AM API version (raising a `BadClientException` if not). Then it makes the call (wrapped in `_do_ssl`). + +* `self._checkValidClient` +Check the `GetVersion` cache for this client, and ensure this client speaks the proper AM API version. Bail if there is a problem with the client. Try changing to a client at a different URL to match the desired AM API version if necessary. + +* `opts.devmode` +It's worth noting here the `devmode` option. This option allows developers to over-ride many of the argument/option error checks +that Omni provides, forcing Omni to do something that looks wrong; perhaps to test the response of an aggregate to that +input. For example, use `devmode` to foce Omni to speak AM API v3 to a v2 client. + +* `self._args_to_slicecred` +This function parses the commandline arguments and then loads/retrieves the proper slice credential. You specify the number of expected arguments for error checking. It gets a slice URN (using the framework translation function), uses `handler_utils._get_slice_cred` to load or retrieve the slice credential, unwraps the credential from JSON if needed, prints the slice expiration, and then +returns the slice name, urn, credential, etc. + +* `self._build_options` +Build the AM API `options` argument for this method call and the specified commandline Omni options. +This includes `geni_end_time`, `geni_start_time`, `geni_best_effort`, `geni_speaking_For`, `geni_extend_alap`, and any arbitrary options specified in the `--optionsfile` JSON file of options. For an example of those options, see http://groups.geni.net/geni/wiki/HowTo/ShareALan or http://groups.geni.net/geni/wiki/GAPI_AM_API_DRAFT/Adopted#ChangeSetQ:Supportchangingusersandkeysonexistingcomputeslivers +This method knows what options are relevant in what AM API methods. As such, it is brittle. `devmode` can be used to force passing options to additional method calls. + +* API API v2 vs v3 functions +Omni tries to stop you from calling an AM API v2 method at an AM API v3 AM. `devmode` allows you to do so anyhow. Note however the interaction with `_correctAPIVersion` which could cause unexpected results; in practice, this does this right thing. + +* `self._build_urns` +For use with AM API v3+, this function builds the urns argument to AM API calls. It includes the slice urn or the specified sliver URNs as needed. + +* `self._retrieve_value` +AM API methods return a triple (`code`, `output`, `value`), and Omni helps extract the real result from this, or a reasonable error message. This method considers also the SSL call return message, if any. This function also attempts to extract any PG based AMs log URL (a URL where full logs of teh call at the AM are available). Omni provides an option to raise an error (an `AMAPIError` with the the return triple) if there is an AM API error return code when using AM API v2: `--raise-error-on-v2-amapi-error`. Otherwise, this method returns an error string or the return value. + +* sliver_info records +The Uniform Federation API specifies a 'sliver info' mechanism, by which tools or aggregates can voluntarily provide sliver records to the clearinghouse. These records record which aggregates have resources reserved for what slices, and when they expire. This information is useful for inferring what aggregates to talk to when acting on a slice. Omni uses this information when you use the `--useSliceAggregates` option and the `framework_chapi` clearinghouse interface. +When using the `framework_chapi`, Omni tries to report this information to the clearinghouse: new slivers reserved (`createsliver` or `provision`), slivers renewed (`renewsliver` or `renew`) or slivers deleted (`deletesliver`, `delete`). Additionally, Omni ensures the records are correct when you call `sliverstatus` or `status`. Since this is also used by the GENI Portal and GENI Desktop, most GENI reservations are properly reported to the GENI clearinghouse. (Reservations made using other clearinghouses will of course not be recorded.) Note that allocated slivers are not reported. Also note that Omni attempts to continue if there is an error with reporting, which could result in mis-matches. +Omni tries to get the proper sliver expiration times. This logic may have errors (where sliver expiration is not reported correctly, or is missing as in some returns from `createsliver`). In such cases, Omni may correct this in a later call, or the expiration may be that of the slice, and therefore the resource may expire sooner than listed; generally this is not harmful. +Additionally, Omni needs a good sliver URN to report. At some AMs, this has been problematic in the past. Omni includes heuristics to determine or generate a sliver URN, and to try to match such generated URNs with later reported URNs. This too could cause problems. +Users may disable sliver info reporting using `--noExtraCHCalls`. +As noted elsewhere, to use these sliver info records, Omni must determine the URN of the aggregate. Omni tries to look up the aggregate URN if it is not available (using the aggregate nickname cache or the clearinghouse or the GetVersion cache), or to guess it from the sliver URN. None of these mechanisms is foolproof, and as such, some resource reservations may not be reported. In general, all aggregates should be listed in the `agg_nick_cache` to ensure the sliver info mechanism works. + +* amhandler sliver result parsing functions +Starting with AM API v3, many functions return a struct or list of structs for teh slivers in the reservation at this AM. `amhandler` provides multiple helper methods for parsing and interpreting these. `_getSliverStatuses` summarizes the allocation/operational status of the slivers. `_didSliversFail` indicates what slivers if any had per sliver failures (as in when the user supplied `--bestEffort`). `_findMissingSlivers` reports on slivers which were in the list of slivers requested to act on but for which there is no result. `_getSliverExpirations` helps summarize when your slivers expire. `_getSliverAllocStates` gets a mapping of sliver to allocation state, optionally filtered to only slivers whose state is not as expected. + +* `do_ssl` +As noted above, `dossl.py` provides the `_do_ssl` wrapper around SSL calls. This allows catching common SSL errors and retrying; for example, mis-typing your SSL key passphrase, or a server reporting an AM API error code indicating it is busy. The number of times to retry and time to pause between attempts is hard coded (4 times, 20 seconds). Other common SSL errors are interpreted to provide a more user friendly error message (such as your user certificate is expired or not trusted). This function also allows suppressing certain error codes - allowing this to look like an empty return with an error message, instead of logging a noisy error. +The tuning of time to wait between busy retries and number of times to retry has been tuned to support the current slowest AMs (like ProtoGENI Utah). But this is brittle and could need future tuning. + +* logging +Omni uses python logging. Omni provides multiple options to tune and configure logging, attempting to be friendly to the use of Omni as a library in another application. Some user level documentation is available in `README-omni`. + +Some times, configuring logging as desired requires manually modifying the python handlers in the calling code. For example, stitcher does things like this: +``` + ot = self.opts.output + if not self.opts.tostdout: + self.opts.output = True + + if not self.opts.debug: + # Suppress all but WARN on console here + lvl = self.logger.getEffectiveLevel() + handlers = self.logger.handlers + if len(handlers) == 0: + handlers = logging.getLogger().handlers + for handler in handlers: + if isinstance(handler, logging.StreamHandler): + lvl = handler.level + handler.setLevel(logging.WARN) + break +# Write the RSpec to a file, not to the log stream.... + retVal, filename = handler_utils._writeRSpec(self.opts, self.logger, reqString, None, '%s-expanded-request'%self.slicename, '', None) +# Then undo the edits to the handler + if not self.opts.debug: + handlers = self.logger.handlers + if len(handlers) == 0: + handlers = logging.getLogger().handlers + for handler in handlers: + if isinstance(handler, logging.StreamHandler): + handler.setLevel(lvl) + break + self.opts.output = ot +``` + +Similar things suppress all but warnings on the console: +``` + if not self.opts.debug: + # Suppress all but WARN on console here + lvl = self.logger.getEffectiveLevel() + handlers = self.logger.handlers + if len(handlers) == 0: + handlers = logging.getLogger().handlers + for handler in handlers: + if isinstance(handler, logging.StreamHandler): + lvl = handler.level + handler.setLevel(logging.WARN) + break + +# Then do something that would log at INFO that you don't want to see + + if not self.opts.debug: + handlers = self.logger.handlers + if len(handlers) == 0: + handlers = logging.getLogger().handlers + for handler in handlers: + if isinstance(handler, logging.StreamHandler): + handler.setLevel(lvl) + break + self.opts.output = ot +``` + +A sample omni logging configuration file is at `src/omni_log_conf_sample.conf`. +Another good example is how Stitcher configures logging. `src/stitcher.py` finds a python logging config file (in its case, `src/gcf/stitcher_logging.conf`). Then stitcher has omni configure logging: `omni.configure_logging(options)`. + +* Omni as a library +See `README-omni`. + +* Saved user and slice creds +Many CH operations require a user credential. Most AM API methods require a user credential or usually a slice credential. These credentials change very infrequently. So Omni can save these, letting you do many things faster. +A future enhancement would automatically cache these. +When you use the `-o` option with `getusercred` or `getslicecred`, you can save the credential. Then through use of `--slicecredfile` or `--usercredfile` you can have Omni load the credential from the saved file. `framework_base.init_user_cred` tries to read a saved user credential from a file. `handler_utils._maybe_save_slicecred` is used to save the slice credential to a file. `handler_utils._get_slice_cred` will call `_load_cred` to load the slice credential from a file if possible. Stitcher uses the saved slice credential so that the numerous individual Omni calls required for a single stich all use the same saved slice credential. +`chhandler` has to be a little careful, particularly in calling `renewslice` and `getslicecred` when there is a saved slice credential. + * m2crypto vs pyopenssl vs ?, managing ssl versions and ciphers, passing chained certs issues, the secure server/client classes * do_ssl (errors it wraps, retries, errors it suppresses) From d0dda49de54a0178379a871bc0208975b2e5b134 Mon Sep 17 00:00:00 2001 From: Aaron Helsinger Date: Tue, 8 Dec 2015 15:11:34 -0500 Subject: [PATCH 05/27] formatting, adding some more --- doc/omni-design-notes.md | 89 +++++++++++++++++++++++++++------------- 1 file changed, 60 insertions(+), 29 deletions(-) diff --git a/doc/omni-design-notes.md b/doc/omni-design-notes.md index 4a964050..3b2c5393 100644 --- a/doc/omni-design-notes.md +++ b/doc/omni-design-notes.md @@ -152,6 +152,7 @@ For a user's guide to Omni, see README-omni.txt Multiple sample and useful scripts that use Omni are in the `examples/` directory. Otherwise all main code is under `src/`. +## Use as Library geni-tools code is structured to make it easier to import it in other tools. Set PYTHONPATH to the `src` directory. To ease this, files use relative imports. See for example `speaksfor_util.py` which uses a @@ -160,7 +161,9 @@ running this file's main directly with absolute imports. For similar reasons, Omni has all its main code in `src/gcf/oscript.py` rather than directly in omni.py. Stitcher should be refactored similarly, but has not been. +See `README-omni`. +## Overall Code Structure Omni calls are handled by a special "handler"; handler.py dispatches to chhandler or amhandler (and Stitcher uses a parallel stitchhandler for future smoother integration). The handler allows invoking any @@ -180,6 +183,7 @@ API v1 and v2 (http://groups.geni.net/geni/wiki/CommonFederationAPIv2). Currentl done dynamically using information from `GetVersion` (like whether the CH supports projects). +## `chhandler` `chhandler` supports calls to the clearinghouse: get a user or slice credential, create or renew a slice, list aggregates, list a user's slices or projects, etc. Each call parses the commandline arguments @@ -187,6 +191,7 @@ slices or projects, etc. Each call parses the commandline arguments clearinghouse call are typically wrapped in `_do_ssl` to support automatic retry. +## `amhandler` `amhandler` supports calls to aggregates, including all AM APIv2, v2, v3, and adopted v4 calls (http://groups.geni.net/geni/wiki/GAPI_AM_API). In addition, a number of aggregate specific calls are supported. Each call parses the arguments itself (e.g. to @@ -216,6 +221,7 @@ UTC but do not have an explicit timezone (naive timestamps). Timestamps are converted to assure this remains true. +## `handler_utils` Many common functions are handled by methods in handler_utils. handler_utils contains methods for loading and saving credentials, for saving command output to a file or printing it as @@ -223,6 +229,7 @@ specified by the options, for getting the list of aggregates, and for looking up aggregates or nicknames in the aggregate nickname cache. +## Aggregate nicknames Omni keeps a cache of aggregate nicknames, by default in `~/.gcf/agg_nick_cache`. This INI format file maps nicknames to aggregate URL and URN. Note that the same URN may have multiple URLs @@ -249,6 +256,7 @@ agg_nick_cache to do so. Therefore, any AM that is not listed in the agg_nick_cache will not be included in Omni operations that use `--useSliceAggregates`. GENI operations must keep the `agg_nick_cache` up to date with the proper AM URLs and list the proper aggregates, to ensure sliver info reporting, availability of reasonable nicknames, and reasonable Omni printouts. Generally, any aggregate that conforms to the AM API and provides reservable resources could be listed in the cache, but GENI policy may require additional testing (reliability for example). Note that there are options for controlling where the cache is saved, and options to force not attempting to download a new cache at all. +## `_listaggregates` handler_utils also provides the `_listaggregates` function for getting a list of aggregates to operate on. First, it handles the `--useSliceAggregates` option. HOWEVER, this only makes sense if there @@ -272,6 +280,7 @@ aggregate nickname (or urn or url). Failing that, Omni uses the the clearinghouse for _all_ aggregates. Except for the explicit CH call to list all aggregates, this is usually the wrong thing. +## Credential Manipulation handler_utils also provides functions for manipulating credentials. Omni can save a slice or user credential, or a speaks for credential, and then load it for use in AM or CH calls. `_load_cred` @@ -282,6 +291,7 @@ clearinghouse for the slice credential, wrapping or unwrapping the credential in JSON as needed. `_save_cred` writes the proper JSON or XML file. +## Saving results handler_utils also provides helpers for printing or saving call results, to STDOUT, the logger, a JSON file, or an XML file, as appropriate, based on the data type and the options. The main method for this is `_printResults`. That function @@ -292,70 +302,71 @@ a filename for saving the rspec using `_construct_output_filename`, and then cal extract out the meaningful bits, remove bad characters, and then create a filename based on that name. +## `amhandler` helpers and details amhandler includes a large number of helper functions to support its operations and simplify the individual methods. -* BadClientException +### BadClientException This helper exception is used to signal that Omni called an AM that spoke the wrong version of the AM API, or is otherwise not callable (see `self._api_call`). Then the calling methods (e.g. `Describe`) can note the failure in the return message, bail if that's the only AM, or continue to the next aggregate. -* GetVersion Cache +### GetVersion Cache In order to call each AM with the proper API version (or call the right URL for an AM), Omni uses the return from GetVersion. Rather than call GetVersion on nearly every call, Omni caches the result of GetVersion for use between Omni invocations. There are multiple options for controlling how long the cache is good for, where it is, or whether to use it at all. `amhandler` has many helper functions for retrieving `GetVersion` values, using the cache if available, or otherwise actually calling GetVersion, and caching the result (including any error return). Note that Omni calls GetVersion twice when the user invokes GetVersion explicitly. -* `self.clients` +### `self.clients` A list of XMLRPC client objects, one per aggregate that the call should be run at. The entries are corrected to point to the right URL by `self._correctAPIVersion`. The veriable is filled in by self._getclients(). That method first calls `handler_utils._listaggregates` to get the right list of aggregates. Then an XMLRPC client is created for each. The client object is marked up with a nickname (using `handler_utils._lookupAggNick`) and a pretty string for printing out the contact. `self._getclients()` is called by each method. -* `self._extractSliceArg` +### `self._extractSliceArg` Get the slice name for use by `handler_utils._listaggregates` in finding the aggregates on which to operate. Called by the `_handle` function, get the the slice name out of the commandline arguments. This function knows which methods take a slice name (or URN), but also which are called on a slice that could conceivably have `sliver_info` records at the clearinghouse, and such could give a list of aggregates at the clearinghouse to operate on. The fact that this knows about the individual method calls is ugly / fragile. -* `self._correctAPIVersion` +### `self._correctAPIVersion` Omni users will often invoke Omni with a generic nickname (`gpo-ig`) or URL, disregarding which version of the AM API they are invoking. They may also easily forget to supply the `-V3` argument when that was intended. This function attempts to correct for these mistakes. This function first ensures that all clients are reachable, dropping those that are not. Then it figures out which AM API version most AMs talk. It then auto corrects which version of the AM API it uses. Later, Omni will change individual clients to use a different URL to match the desired AM API version as needed (see `_checkValidClient and how it is called from `_api_call`). -* `self._api_call` +### `self._api_call` This function wraps calls to the XMLRPC AM clients. First it ensures that the client exists and speaks the correct AM API version (raising a `BadClientException` if not). Then it makes the call (wrapped in `_do_ssl`). -* `self._checkValidClient` +### `self._checkValidClient` Check the `GetVersion` cache for this client, and ensure this client speaks the proper AM API version. Bail if there is a problem with the client. Try changing to a client at a different URL to match the desired AM API version if necessary. -* `opts.devmode` +### `opts.devmode` It's worth noting here the `devmode` option. This option allows developers to over-ride many of the argument/option error checks that Omni provides, forcing Omni to do something that looks wrong; perhaps to test the response of an aggregate to that input. For example, use `devmode` to foce Omni to speak AM API v3 to a v2 client. -* `self._args_to_slicecred` +### `self._args_to_slicecred` This function parses the commandline arguments and then loads/retrieves the proper slice credential. You specify the number of expected arguments for error checking. It gets a slice URN (using the framework translation function), uses `handler_utils._get_slice_cred` to load or retrieve the slice credential, unwraps the credential from JSON if needed, prints the slice expiration, and then returns the slice name, urn, credential, etc. -* `self._build_options` +### `self._build_options` Build the AM API `options` argument for this method call and the specified commandline Omni options. This includes `geni_end_time`, `geni_start_time`, `geni_best_effort`, `geni_speaking_For`, `geni_extend_alap`, and any arbitrary options specified in the `--optionsfile` JSON file of options. For an example of those options, see http://groups.geni.net/geni/wiki/HowTo/ShareALan or http://groups.geni.net/geni/wiki/GAPI_AM_API_DRAFT/Adopted#ChangeSetQ:Supportchangingusersandkeysonexistingcomputeslivers This method knows what options are relevant in what AM API methods. As such, it is brittle. `devmode` can be used to force passing options to additional method calls. -* API API v2 vs v3 functions +### API API v2 vs v3 functions Omni tries to stop you from calling an AM API v2 method at an AM API v3 AM. `devmode` allows you to do so anyhow. Note however the interaction with `_correctAPIVersion` which could cause unexpected results; in practice, this does this right thing. -* `self._build_urns` +### `self._build_urns` For use with AM API v3+, this function builds the urns argument to AM API calls. It includes the slice urn or the specified sliver URNs as needed. -* `self._retrieve_value` +### `self._retrieve_value` AM API methods return a triple (`code`, `output`, `value`), and Omni helps extract the real result from this, or a reasonable error message. This method considers also the SSL call return message, if any. This function also attempts to extract any PG based AMs log URL (a URL where full logs of teh call at the AM are available). Omni provides an option to raise an error (an `AMAPIError` with the the return triple) if there is an AM API error return code when using AM API v2: `--raise-error-on-v2-amapi-error`. Otherwise, this method returns an error string or the return value. -* sliver_info records +### sliver_info records The Uniform Federation API specifies a 'sliver info' mechanism, by which tools or aggregates can voluntarily provide sliver records to the clearinghouse. These records record which aggregates have resources reserved for what slices, and when they expire. This information is useful for inferring what aggregates to talk to when acting on a slice. Omni uses this information when you use the `--useSliceAggregates` option and the `framework_chapi` clearinghouse interface. When using the `framework_chapi`, Omni tries to report this information to the clearinghouse: new slivers reserved (`createsliver` or `provision`), slivers renewed (`renewsliver` or `renew`) or slivers deleted (`deletesliver`, `delete`). Additionally, Omni ensures the records are correct when you call `sliverstatus` or `status`. Since this is also used by the GENI Portal and GENI Desktop, most GENI reservations are properly reported to the GENI clearinghouse. (Reservations made using other clearinghouses will of course not be recorded.) Note that allocated slivers are not reported. Also note that Omni attempts to continue if there is an error with reporting, which could result in mis-matches. Omni tries to get the proper sliver expiration times. This logic may have errors (where sliver expiration is not reported correctly, or is missing as in some returns from `createsliver`). In such cases, Omni may correct this in a later call, or the expiration may be that of the slice, and therefore the resource may expire sooner than listed; generally this is not harmful. @@ -363,14 +374,14 @@ Additionally, Omni needs a good sliver URN to report. At some AMs, this has been Users may disable sliver info reporting using `--noExtraCHCalls`. As noted elsewhere, to use these sliver info records, Omni must determine the URN of the aggregate. Omni tries to look up the aggregate URN if it is not available (using the aggregate nickname cache or the clearinghouse or the GetVersion cache), or to guess it from the sliver URN. None of these mechanisms is foolproof, and as such, some resource reservations may not be reported. In general, all aggregates should be listed in the `agg_nick_cache` to ensure the sliver info mechanism works. -* amhandler sliver result parsing functions +### amhandler sliver result parsing functions Starting with AM API v3, many functions return a struct or list of structs for teh slivers in the reservation at this AM. `amhandler` provides multiple helper methods for parsing and interpreting these. `_getSliverStatuses` summarizes the allocation/operational status of the slivers. `_didSliversFail` indicates what slivers if any had per sliver failures (as in when the user supplied `--bestEffort`). `_findMissingSlivers` reports on slivers which were in the list of slivers requested to act on but for which there is no result. `_getSliverExpirations` helps summarize when your slivers expire. `_getSliverAllocStates` gets a mapping of sliver to allocation state, optionally filtered to only slivers whose state is not as expected. -* `do_ssl` +## `do_ssl` As noted above, `dossl.py` provides the `_do_ssl` wrapper around SSL calls. This allows catching common SSL errors and retrying; for example, mis-typing your SSL key passphrase, or a server reporting an AM API error code indicating it is busy. The number of times to retry and time to pause between attempts is hard coded (4 times, 20 seconds). Other common SSL errors are interpreted to provide a more user friendly error message (such as your user certificate is expired or not trusted). This function also allows suppressing certain error codes - allowing this to look like an empty return with an error message, instead of logging a noisy error. The tuning of time to wait between busy retries and number of times to retry has been tuned to support the current slowest AMs (like ProtoGENI Utah). But this is brittle and could need future tuning. -* logging +## logging Omni uses python logging. Omni provides multiple options to tune and configure logging, attempting to be friendly to the use of Omni as a library in another application. Some user level documentation is available in `README-omni`. Some times, configuring logging as desired requires manually modifying the python handlers in the calling code. For example, stitcher does things like this: @@ -434,23 +445,43 @@ Similar things suppress all but warnings on the console: A sample omni logging configuration file is at `src/omni_log_conf_sample.conf`. Another good example is how Stitcher configures logging. `src/stitcher.py` finds a python logging config file (in its case, `src/gcf/stitcher_logging.conf`). Then stitcher has omni configure logging: `omni.configure_logging(options)`. -* Omni as a library -See `README-omni`. - -* Saved user and slice creds +## Saved user and slice creds Many CH operations require a user credential. Most AM API methods require a user credential or usually a slice credential. These credentials change very infrequently. So Omni can save these, letting you do many things faster. A future enhancement would automatically cache these. When you use the `-o` option with `getusercred` or `getslicecred`, you can save the credential. Then through use of `--slicecredfile` or `--usercredfile` you can have Omni load the credential from the saved file. `framework_base.init_user_cred` tries to read a saved user credential from a file. `handler_utils._maybe_save_slicecred` is used to save the slice credential to a file. `handler_utils._get_slice_cred` will call `_load_cred` to load the slice credential from a file if possible. Stitcher uses the saved slice credential so that the numerous individual Omni calls required for a single stich all use the same saved slice credential. `chhandler` has to be a little careful, particularly in calling `renewslice` and `getslicecred` when there is a saved slice credential. -* m2crypto vs pyopenssl vs ?, managing ssl versions and ciphers, -passing chained certs issues, the secure server/client classes -* do_ssl (errors it wraps, retries, errors it suppresses) -* AM method return struct (keeping it common) -* output control options and their interaction -* todo items (summarize tix, code cleanup, pure API call versions, ?) -* show create sliver pseudo code to walk much of the sub systems -* ? +## Making SSL connections +There are multiple ways of making SSL connections from python. geni-tools uses some M2Crypto and some PyOpenSSL. +`secure_xmlrpc_client.py` and `xmlrpc/client.py` use PyOpenSSL. There was an attempt to use M2Crypto, particularly to support a callback for entering the SSL passphrase only once, but this had trouble. Unused code remains for future potential use. +Note that managing the SSL version and the ciphers used in creating the SSL connection has been an issue in the past. There are notes on github issues. In particular, remember that Omni should work on Windows and Mac as well as Linux, and there are a wide variety of servers it must talk to. +Also note that Omni wants to authenticate with a client certificate over SSL, which is unusual among python libraries. In addition, it must pass a full chain of certificates in general (an MA and a user cert). And do this with an XMLRPC connection. Ensuring the cert chain is passed, and that SSL timeouts are honored, has been an issue in the past. +Additionally, Omni attempts to work with Python 2.6 and 2.7, including more recent 2.7.9. These various versions introduce differences that Omni must work around. + +Currently, by default Omni specified that it wants TLSv1. By default, Python would do SSLv23 (which secretly also allows SSLv3). This enures TLS is supported and that servers that have disabled both SSLV2 and v3 (as generally recommended) will work. +Additionally, Omni by default uses a cipher list that tries to avoid most weak ciphers (though python2.6 ignores our requested cipher list). +See `xmlrpc/client.make_client`. + +On the server side, the relevant file is `gcf.geni.SecureXMLRPCServer`. This is an XMLRPCServer where on each connection we get the peer (client) certificate, and we wrap the socket in an SSL connection. We specify that we accept SSLv23. Ideally we'd specify the ciphers too, but that doesn't (easily) work, and specifying SSL versions of TLSv1 risks locking out some clients. + +## AM method return struct +All public methods return a list +of 2 elements: a pretty string to describe the result, and an object +that is the return value. The type of the return value depends on the +specific method call. +This common return simplifies tools that use Omni. +The pretty string should be reasonably short for printing. +Note that it might be nice to add the raw return tuple that the aggregate ret +(keeping it common) + +## Output control +options and their interaction + +## To Do items +(summarize tix, code cleanup, pure API call versions, ?) + +## show create sliver pseudo code to walk much of the sub systems + # stitcher * SCS From abf49e59afac104f2cb00a07025304ba38782ab0 Mon Sep 17 00:00:00 2001 From: Aaron Helsinger Date: Wed, 9 Dec 2015 16:32:35 -0500 Subject: [PATCH 06/27] added still more --- doc/omni-design-notes.md | 46 +++++++++++++++++++++++++++++++++------- 1 file changed, 38 insertions(+), 8 deletions(-) diff --git a/doc/omni-design-notes.md b/doc/omni-design-notes.md index 3b2c5393..bef3b3e7 100644 --- a/doc/omni-design-notes.md +++ b/doc/omni-design-notes.md @@ -170,7 +170,10 @@ for future smoother integration). The handler allows invoking any method in the handler classes (excluding private methods, indicated by a name that starts with `_`). Handlers do two kinds of operations: Call a clearinghouse using a 'framework' (to create a slice or get a credential for -example), and calls to an aggregate. Omni supports multiple +example), and calls to an aggregate. + +## Frameworks and contacting clearinghouses +Omni supports multiple clearinghouse APIs, whose differences are abstracted away with a 'framework' whose API is defined in framework_base.py. The framework handles getting the user and slice credentials. Additionally, in AM @@ -182,14 +185,15 @@ the `omni_config`. `framework_chapi` supports the Uniform Federation API v1 and v2 (http://groups.geni.net/geni/wiki/CommonFederationAPIv2). Currently it hard codes some assumptions that should be done dynamically using information from `GetVersion` (like whether the CH supports projects). +Note that each 'framework' represents a different clearinghouse API. These differences are hidden by Omni behind `chhandler`. It would be nice if there were a way to directly call the individual framework APIs. ## `chhandler` `chhandler` supports calls to the clearinghouse: get a user or slice credential, create or renew a slice, list aggregates, list a user's -slices or projects, etc. Each call parses the commandline arguments +slices or projects, etc. The supported calls are necessarily a subset of the functionality that any given framework / clearinghouse API supports. Each call parses the commandline arguments (not options) itself. Calls to the proper framework to do the clearinghouse call are typically wrapped in `_do_ssl` to support -automatic retry. +automatic retry. ## `amhandler` `amhandler` supports calls to aggregates, including all AM APIv2, v2, @@ -235,7 +239,7 @@ Omni keeps a cache of aggregate nicknames, by default in aggregate URL and URN. Note that the same URN may have multiple URLs (different AM API versions typically), and the same URL could have multiple nicknames. The cache is maintained in git and posted on the -Omni wiki (currently at http://trac.gpolab.bbn.com/gcf/raw-attachment/wiki/Omni/agg_nick_cache). Omni downloads the cache once daily (configurable). Nicknames in the cache +Omni wiki (currently at https://raw.githubusercontent.com/wiki/ahelsing/geni-tools/agg_nick_cache). Omni downloads the cache once daily (configurable). Nicknames in the cache are ordered by convention with AM API agnostic nicknames before those specific to a version, and then by API version number. Nicknames are typically `-[version#]`, e.g. "moxi-of1". For some purposes, @@ -255,6 +259,7 @@ on this slice. Then Omni must look up a URL for that URN, and uses the agg_nick_cache to do so. Therefore, any AM that is not listed in the agg_nick_cache will not be included in Omni operations that use `--useSliceAggregates`. GENI operations must keep the `agg_nick_cache` up to date with the proper AM URLs and list the proper aggregates, to ensure sliver info reporting, availability of reasonable nicknames, and reasonable Omni printouts. Generally, any aggregate that conforms to the AM API and provides reservable resources could be listed in the cache, but GENI policy may require additional testing (reliability for example). Note that there are options for controlling where the cache is saved, and options to force not attempting to download a new cache at all. +Also note that much of the information in the `agg_nick_cache` is duplicated in the GENI Clearinghouse' service registry. It might be nice if this data could be retrieved from that registry or some similar database, reducing the number of sources of such information. ## `_listaggregates` handler_utils also provides the `_listaggregates` function for getting @@ -471,14 +476,39 @@ that is the return value. The type of the return value depends on the specific method call. This common return simplifies tools that use Omni. The pretty string should be reasonably short for printing. -Note that it might be nice to add the raw return tuple that the aggregate ret -(keeping it common) +Note that it might be nice to add the raw return tuple that the aggregate returns (code, value, output), perhaps as a 3rd item in the triple that the methods return. But this would cause multiple changes, so be careful. + ## Output control -options and their interaction +Omni provides multiple options for controlling its output. The primary output is the python logger, which logs to STDERR (console) by default. With the `-o` option (and related options), primary output (like rspecs and credentials) can be sent to a file. With the `--tostdout` option that output goes to STDOUT instead. Supply your own python logging config file to further control Omni output (use `--logconfig`) or tell Omni not to configure logging at all (because the caller tool has already done so - use `--noLoggingConfiguration`). +For some purposes, it might be nice if Omni sent everything to STDOUT instead of STDERR (e.g. to pipe the output to `grep`). The output control functions are in `handler_utils`; see above. ## To Do items -(summarize tix, code cleanup, pure API call versions, ?) +The open issues in Github cover many of the outstanding tasks and wishlist items for Omni. To highlight a few: +- #854: SFA code has been updated. There is a branch on a fork to update to the latest SFA, to make future integration easier +- #814: There remain some references to GPO lab servers, which will go away or change names before too long +- #829: There is code duplication between the omni `client.py` and the GCF `secure_xmlrrpc_client.py` +- #820: What should the dependency of GCF on Omni or Omni on GCF be? Could they be independent? Currently GCF `am3.py` depends on `omnilib` (see related #819) +- #773: It would help tools using Omni if exceptions were more specific +- #592: Add library functions that are raw AM API calls, for use by tools +- #427: Provide a way to get the full return triple from AM calls +- #766: `rspec_util` uses XML parsers but does very little with that, and the parsers don't handle everything an XML document could have smoothly +- #752: Does Omni properly return a non 0 exit code when there is an AM API error? +- #656: Omni could infer the AMs to reserve resources at from your (bound) RSpec, similar to how stitcher does +- #655: Many stitcher utilities could be part of Omni +- #652: Calling `poa geni_update_keys` when using a PG clearinghouse causes existing SSH keys on nodes to be removed +- #525: The code for looking up nicknames / URNs is ugly. Refactor it +- #524: The code for handling `--useSliceAggregates` includes some ugly hacks. Refactor it. +- #520: When searching for a URL or nickname, consider the desired AM API version +- #494: The CHAPI clearinghouse framework should use the `get_version` return to decide which functions to call, which services are supported +- #457: Find a way to ask for the SSL passphrase only once +- #430: Omni does not handle an HTTP redirect + +Overall, it has been a couple years since Omni was refactored. It is time. When doing so, consider ways to split up Omni to better support the multiple audiences: +- Omni for newbie experimenters +- Omni for expert experimenters +- Omni for developers +- Omni as a library for other tools ## show create sliver pseudo code to walk much of the sub systems From 289733889be1aed3e1a51b3b3c2038ea925f8a5b Mon Sep 17 00:00:00 2001 From: Aaron Helsinger Date: Wed, 9 Dec 2015 16:41:40 -0500 Subject: [PATCH 07/27] minor formatting fix --- CHANGES | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGES b/CHANGES index 17decc04..ac189b8d 100644 --- a/CHANGES +++ b/CHANGES @@ -3,7 +3,7 @@ gcf 2.10: * Changed references to trac.gpolab.bbn.com to point to Github. Although those pages mostly still reference trac, that is the future home. - These changes include changing where the agg_nick_cache lives. (#814) + These changes include changing where the `agg_nick_cache` lives. (#814) * Omni * Continue anyway if no aggregate nickname cache can be loaded. (#822) From a6d30544ae647ea0b03518765dce42000a60b11c Mon Sep 17 00:00:00 2001 From: Aaron Helsinger Date: Wed, 9 Dec 2015 16:56:59 -0500 Subject: [PATCH 08/27] issue #879: when merging links on a manifest, don't insist it have a VLAN, so we can merge EGRE or GRE links. Thanks, Hussam. --- CHANGES | 2 ++ src/gcf/omnilib/stitch/ManifestRSpecCombiner.py | 4 ++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/CHANGES b/CHANGES index ac189b8d..64c19973 100644 --- a/CHANGES +++ b/CHANGES @@ -41,6 +41,8 @@ gcf 2.10: in some cases. (#839) * AL2S supports speaks for. Don't exit if using speaksfor and AL2S. (#834) * Treat new generic ProtoGENI mapper error code (28) as fatal. (#861) + * Fix combining manifests where link is multi AM but not stitched. (#879) + * Thanks to Hussam Nasir * omni-configure * Modify omni-configure to support multi-user systems (#843) diff --git a/src/gcf/omnilib/stitch/ManifestRSpecCombiner.py b/src/gcf/omnilib/stitch/ManifestRSpecCombiner.py index 2b923149..8a6f37a6 100644 --- a/src/gcf/omnilib/stitch/ManifestRSpecCombiner.py +++ b/src/gcf/omnilib/stitch/ManifestRSpecCombiner.py @@ -552,8 +552,8 @@ def combineLinks(self, ams_list, dom_template): break # Get the link with a sliverid and the right client_id if str(link2.getAttribute(CLIENT_ID)) == client_id and \ - link2.hasAttribute(VLANTAG): - self.logger.debug("Found AM %s link '%s' that has vlantag '%s'", agg.urn, client_id, link2.getAttribute('vlantag')) + (link2.hasAttribute(VLANTAG) or link2.hasAttribute(SLIVER_ID)): + self.logger.debug("Found AM %s link '%s' that has sliverid '%s' and possibly a vlantag '%s'", agg.urn, client_id,link2.hasAttribute(SLIVER_ID), link2.getAttribute(VLANTAG)) if needSwap: self.logger.debug("Will swap link in template with this element") link2Clone = link2.cloneNode(True) From 66143155d5bb87172bdfb9caf61a126cd0b9bd9d Mon Sep 17 00:00:00 2001 From: Aaron Helsinger Date: Thu, 10 Dec 2015 10:14:26 -0500 Subject: [PATCH 09/27] adding more on stitching --- doc/omni-design-notes.md | 43 +++++++++++++++++++++++++++++++++++++--- 1 file changed, 40 insertions(+), 3 deletions(-) diff --git a/doc/omni-design-notes.md b/doc/omni-design-notes.md index bef3b3e7..899c282e 100644 --- a/doc/omni-design-notes.md +++ b/doc/omni-design-notes.md @@ -487,18 +487,18 @@ For some purposes, it might be nice if Omni sent everything to STDOUT instead of The open issues in Github cover many of the outstanding tasks and wishlist items for Omni. To highlight a few: - #854: SFA code has been updated. There is a branch on a fork to update to the latest SFA, to make future integration easier - #814: There remain some references to GPO lab servers, which will go away or change names before too long +- #427: Provide a way to get the full return triple from AM calls - #829: There is code duplication between the omni `client.py` and the GCF `secure_xmlrrpc_client.py` - #820: What should the dependency of GCF on Omni or Omni on GCF be? Could they be independent? Currently GCF `am3.py` depends on `omnilib` (see related #819) - #773: It would help tools using Omni if exceptions were more specific - #592: Add library functions that are raw AM API calls, for use by tools -- #427: Provide a way to get the full return triple from AM calls +- #525: The code for looking up nicknames / URNs is ugly. Refactor it +- #524: The code for handling `--useSliceAggregates` includes some ugly hacks. Refactor it. - #766: `rspec_util` uses XML parsers but does very little with that, and the parsers don't handle everything an XML document could have smoothly - #752: Does Omni properly return a non 0 exit code when there is an AM API error? - #656: Omni could infer the AMs to reserve resources at from your (bound) RSpec, similar to how stitcher does - #655: Many stitcher utilities could be part of Omni - #652: Calling `poa geni_update_keys` when using a PG clearinghouse causes existing SSH keys on nodes to be removed -- #525: The code for looking up nicknames / URNs is ugly. Refactor it -- #524: The code for handling `--useSliceAggregates` includes some ugly hacks. Refactor it. - #520: When searching for a URL or nickname, consider the desired AM API version - #494: The CHAPI clearinghouse framework should use the `get_version` return to decide which functions to call, which services are supported - #457: Find a way to ask for the SSL passphrase only once @@ -510,10 +510,47 @@ Overall, it has been a couple years since Omni was refactored. It is time. When - Omni for developers - Omni as a library for other tools +Other possible improvements are noted inline above. + ## show create sliver pseudo code to walk much of the sub systems # stitcher +Stitcher is a tool that uses Omni to coordinate reservations among multiple aggregates. For usage information, see README-stitching.txt. +Stitcher uses the Omni option parser and logging configuration, and then does multiple instances of `omni.call()` to invoke numerous AM API calls. + +## Stitching Overview +GENI stitching breaks up the reservation of coordinated slices into individual reservations at multiple aggregates. Each aggregate simply reserves what is requested of it. It is the responsibility of the tool to coordinate those reservations as necessary. For example, the tool may reserve a link at Aggregate A, and Aggregate A will provide that link. It is up to the tool to reserve the other end of that link at Aggregate B. If the tool does not do so, nothing useful will happen on that link, but Aggregate A does not care. However, a good tool would look at the specific link allocated by Aggregate A, and ensure it reserves the matching link at Aggregate B; for example, using the same VLAN tag number. +In general, there could be multiple reasons why the reservation at a second aggregate depends on what is reserved at the first aggregate. The Stitcher tool handles the case of using the same VLAN tag at multiple aggregates. +GENI provides multiple mechanisms for creating links between resources at multiple aggregates: GRE and EGRE links, specialized aggregates like VTS, and VLAN circuits. Stitcher focuses primarily on VLAN circuits, and that is what we refer to when we speak of GENI Stitched links. +GENI provides experimenters a private custom topology by using VLAN tags across the GENI network. Experimenters can then modify anything within their layer 2 network. Stitching works because GENI operators pre-negotiate a range of VLANs across campus, regionals, and backbone providers to be dedicated to GENI and the ports connecting GENI resources. These pools of VLANs are then managed by GENI aggregates. GENI stitching then involves the coordinated reservation of those VLAN tags across a circuit of aggregates/resources. +One variation on GENI stitching, is the creation of Openflow controlled stitcher circuits. In this variation, the aggregates give the slice a VLAN on the switch, but also connect a designated Openflow controller to that VLAN circuit, allowing the experimenter to control traffic on their VLAN using their Openflow controller. Experimenters can do this using the normal stitching mechanism, but specifying an Openflow controller within the main body ``. More properly, experimenters would use version 2 of the stitching RSpec extension which allows specifying the Openflow controller as part of the stitching request. + +## Stitcher workflow +Fundamentally, stitcher does a series of reservations at aggregates using Omni. Stitcher figures out the dependency among aggregates, and then makes a sequence of reservations. Stitcher reserves a VLAN at the first aggregate, reads out the VLAN tag that was assigned, and then requests the same VLAN tag at the next aggregate in the circuit. In the end, the slice has reservations at multiple aggregates with consistent VLAN tags. Stitcher then collects and integrates the manifest RSpecs from the multiple aggregates, and reports the result to the experimenter as a single manifest RSpec. + +This process is made more complex by error handling. Any given reservation may fail, due perhaps to a problem in the request, unavailability of compute resources, or unavailability of the requested VLAN tag. Stitcher works hard to determine whether the request is fatally flawed, or whether some part of the reservation can be productively deleted and retried automatically. A number of other factors complicate stitching: +* Some aggregates can translate VLAN tags (using 1 VLAN tag on the way in, and another on the way out), and some cannot +* Some aggregate prefer to select the VLAN tag (producers), and some want to be told what VLAN tag to use (consumers) +* Stitched links request a given bandwidth (typically just a best effort bookkeeping reservation) that must be satisfied +* A given slice may use multiple stitched links, and may use multiple inter aggregate link types +* No GENI aggregates currently support multi point circuits, so slices must be made of multiple circuits + + +## Stitching Links +Some links for learning more about stitching in general and GENI stitching: +* GENI Stitching and links to SCS code and the stitching extension: https://wiki.maxgigapop.net/twiki/bin/view/GENI/NetworkStitchingOverview +* SCS code on Github: https://github.com/xi-yang/MXTCE-GENI-SCS +* Some sample stitching RSpecs: http://groups.geni.net/geni/browser/trunk/stitch-examples +* A stitching tutorial: http://groups.geni.net/geni/wiki/GENIExperimenter/Tutorials/StitchingTutorial +* Stitching RSpec extension v2 (mostly unused): https://www.geni.net/resources/rspec/ext/stitch/2/stitch-schema.xsd +* Tested stitching sites: http://groups.geni.net/geni/wiki/GeniNetworkStitchingSites +* Slides describing stitching to experimenters: http://groups.geni.net/geni/attachment/wiki/GEC20Agenda/InterAggExpts/GEC20-InterAggregate.pdf +* Most recent developer stitching slides: http://groups.geni.net/geni/attachment/wiki/GEC16Agenda/DevelopersGrabBag/geni-gec16-stitching.pdf +* Old out of date page on GENI stitching: http://groups.geni.net/geni/wiki/GeniNetworkStitching +* PG stitching: http://www.protogeni.net/ProtoGeni/wiki/Stitching +* Orca stitching: https://geni-orca.renci.org/trac/wiki/Stitching + * SCS * where to find docs and code, who runs it (contact), who maintains it (contact) From b955d495ae4b7f8b966a4cbd6851ddc7217ed45b Mon Sep 17 00:00:00 2001 From: Aaron Helsinger Date: Thu, 10 Dec 2015 10:24:19 -0500 Subject: [PATCH 10/27] Issue #814: Tom feels its easier to just get the agg_nick_cache out of the master branch in git. So change the canonical location to match --- README-omni.txt | 4 ++-- acceptance_tests/AM_API/README-accept-AMAPI.txt | 6 +++--- agg_nick_cache.base | 3 ++- doc/IssuingReleases.md | 5 +---- omni_config.sample | 2 +- src/gcf/oscript.py | 2 +- 6 files changed, 10 insertions(+), 12 deletions(-) diff --git a/README-omni.txt b/README-omni.txt index 2ef5925a..1b65865e 100644 --- a/README-omni.txt +++ b/README-omni.txt @@ -853,8 +853,8 @@ Options: --AggNickDefinitiveLocation=AGGNICKDEFINITIVELOCATION Website with latest agg_nick_cache, default is https://raw.githubusercontent.com/wiki/GENI-NSF/geni- - tools/agg_nick_cache. To force Omni to read this - cache, delete your local AggNickCache or use + tools/master/agg_nick_cache.base. To force Omni to + read this cache, delete your local AggNickCache or use --NoAggNickCache. For Developers / Advanced Users: diff --git a/acceptance_tests/AM_API/README-accept-AMAPI.txt b/acceptance_tests/AM_API/README-accept-AMAPI.txt index 9a805211..ee554a1a 100644 --- a/acceptance_tests/AM_API/README-accept-AMAPI.txt +++ b/acceptance_tests/AM_API/README-accept-AMAPI.txt @@ -592,9 +592,9 @@ Options: ~/.gcf/agg_nick_cache --AggNickDefinitiveLocation=AGGNICKDEFINITIVELOCATION Website with latest agg_nick_cache, default is - https://raw.githubusercontent.com/wiki/GENI-NSF/geni- - tools/agg_nick_cache. To force Omni to read this - cache, delete your local AggNickCache or use + https://raw.githubusercontent.com/GENI-NSF/geni- + tools/master/agg_nick_cache.base. To force Omni to + read this cache, delete your local AggNickCache or use --NoAggNickCache. For Developers / Advanced Users: diff --git a/agg_nick_cache.base b/agg_nick_cache.base index 05af7338..8bb2d94b 100644 --- a/agg_nick_cache.base +++ b/agg_nick_cache.base @@ -1,5 +1,6 @@ ### DO NOT MODIFY THIS FILE BY HAND ### -# This file lives at: https://raw.githubusercontent.com/wiki/GENI-NSF/geni-tools/agg_nick_cache +# This file lives at: https://raw.githubusercontent.com/GENI-NSF/geni-tools/master/agg_nick_cache.base +# - the master branch of the geni-tools Github repository # Last updated on December 9, 2015 [omni_defaults] diff --git a/doc/IssuingReleases.md b/doc/IssuingReleases.md index 83e590fb..df0bacb6 100644 --- a/doc/IssuingReleases.md +++ b/doc/IssuingReleases.md @@ -181,10 +181,7 @@ Update the geni-tools wiki pages to describe the new release, and point to the n * `GcfQuickStart`: Update with `README-gcf.txt * `Windows`: Update version numbers, download links * `MacOS`: Update version numbers, download links -* `agg_nick_cache`: This file lives on Github only (see https://raw.githubusercontent.com/wiki/GENI-NSF/geni-tools/agg_nick_cache). Update with latest `agg_nick_cache.base` from the develop branch, where you updated the release date for this release - * To edit this on Github: - * Check out the geni-tools wiki on your machine. - * Edit the file and commit it to git, pushing to origin/master as usual. +* `agg_nick_cache`: This file lives on Github now (see https://raw.githubusercontent.com/GENI-NSF/geni-tools/master/agg_nick_cache.base). After the release, update the version on the master branch in git to list the current Omni version / release date. * Close existing milestone * Create new milestone * Re target any remaining issues that were not be fixed for this release to the next release. diff --git a/omni_config.sample b/omni_config.sample index 7e1ba737..910f3741 100644 --- a/omni_config.sample +++ b/omni_config.sample @@ -79,7 +79,7 @@ default_cf = my_gcf #------AM nicknames # Omni defines a standard set of aggregate nicknames. These are retrieved periodically -# from https://raw.githubusercontent.com/wiki/GENI-NSF/geni-tools/agg_nick_cache +# from https://raw.githubusercontent.com/GENI-NSF/geni-tools/master/agg_nick_cache.base # Put your custom aggregate nicknames here. # To see all available nicknames try: omni.py nicknames # diff --git a/src/gcf/oscript.py b/src/gcf/oscript.py index 2c35dfc6..1bc020cf 100755 --- a/src/gcf/oscript.py +++ b/src/gcf/oscript.py @@ -1186,7 +1186,7 @@ def getParser(): default="~/.gcf/agg_nick_cache", help="File where AggNick info will be cached, default is %default") angroup.add_option("--AggNickDefinitiveLocation", dest='aggNickDefinitiveLocation', - default="https://raw.githubusercontent.com/wiki/GENI-NSF/geni-tools/agg_nick_cache", + default="https://raw.githubusercontent.com/GENI-NSF/geni-tools/master/agg_nick_cache.base", help="Website with latest agg_nick_cache, default is %default. To force Omni to read this cache, delete your local AggNickCache or use --NoAggNickCache.") parser.add_option_group( angroup ) From ba537d9f54beb36857d3477f3c92a4b46c59ab52 Mon Sep 17 00:00:00 2001 From: Aaron Helsinger Date: Thu, 10 Dec 2015 10:37:56 -0500 Subject: [PATCH 11/27] Add debug printout when start download from github, since it is slow --- src/gcf/oscript.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/gcf/oscript.py b/src/gcf/oscript.py index 1bc020cf..0d5a89c5 100755 --- a/src/gcf/oscript.py +++ b/src/gcf/oscript.py @@ -486,6 +486,7 @@ def update_agg_nick_cache( opts, logger ): directory = os.path.dirname(opts.aggNickCacheName) if not os.path.exists( directory ): os.makedirs( directory ) + logger.debug("Attempting to refresh agg_nick_cache from %s...", opts.aggNickDefinitiveLocation) urllib.urlretrieve( opts.aggNickDefinitiveLocation, tmpcache ) good = False if os.path.exists(tmpcache) and os.path.getsize(tmpcache) > 0: From dfd80f8f98ee03dafcb732473d80505427fff401 Mon Sep 17 00:00:00 2001 From: Aaron Helsinger Date: Thu, 10 Dec 2015 14:24:27 -0500 Subject: [PATCH 12/27] Issue #881: Use urllib2 not urllib cause of bad interaction with M2Crypto --- CHANGES | 2 ++ README-omni.txt | 2 ++ src/gcf/oscript.py | 12 ++++++++++-- 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/CHANGES b/CHANGES index 64c19973..1daf869c 100644 --- a/CHANGES +++ b/CHANGES @@ -23,6 +23,8 @@ gcf 2.10: no longer means just return that file. Instead, that file will be ignored and, if you specify `-o`, replaced. (#868) * Moved canonical `agg_nick_cache` location to Github. (#814) + * Use `urllib2.urlopen` instead of `urllib.urlretrieve` to avoid bad + interaction with M2Crypto. (#881) * Stitcher * Catch expiration too great errors from PG AMs and quit. (#828) diff --git a/README-omni.txt b/README-omni.txt index 1b65865e..ca624eee 100644 --- a/README-omni.txt +++ b/README-omni.txt @@ -59,6 +59,8 @@ New in v2.10: no longer means just return that file. Instead, that file will be ignored and, if you specify `-o`, replaced. (#868) * Moved canonical `agg_nick_cache` location to Github. (#814) + * Use `urllib2.urlopen` instead of `urllib.urlretrieve` to avoid bad + interaction with M2Crypto. (#881) New in v2.9: * If `sliverstatus` fails in a way that indicates there are no local resources, diff --git a/src/gcf/oscript.py b/src/gcf/oscript.py index 0d5a89c5..179c4e66 100755 --- a/src/gcf/oscript.py +++ b/src/gcf/oscript.py @@ -115,7 +115,7 @@ import os import shutil import sys -import urllib +import urllib2 from .omnilib.util import OmniError, AMAPIError from .omnilib.handler import CallHandler @@ -487,7 +487,15 @@ def update_agg_nick_cache( opts, logger ): if not os.path.exists( directory ): os.makedirs( directory ) logger.debug("Attempting to refresh agg_nick_cache from %s...", opts.aggNickDefinitiveLocation) - urllib.urlretrieve( opts.aggNickDefinitiveLocation, tmpcache ) + # Do not use urllib here, because urllib interacts badly with M2Crypto + # which overrites the URLopener.open_https method in a way that makes opening https + # connections take 60 seconds where they should take 5. + # (we've imported M2Crypto here indirectly via sfa.trust.gid) + # See http://nostacktrace.com/dev/2011/2/4/no-love-for-the-monkey-patch.html + # urllib.urlretrieve( opts.aggNickDefinitiveLocation, tmpcache ) + handle = urllib2.urlopen(opts.aggNickDefinitiveLocation) + with open (tmpcache, "w") as f: + f.write(handle.read()) good = False if os.path.exists(tmpcache) and os.path.getsize(tmpcache) > 0: if os.path.exists(opts.aggNickCacheName) and os.path.getsize(opts.aggNickCacheName) > 0: From 25f9185726bd1a08368c95f17354c8fad591cf01 Mon Sep 17 00:00:00 2001 From: Aaron Helsinger Date: Thu, 10 Dec 2015 14:25:58 -0500 Subject: [PATCH 13/27] fix typo in help message sample --- README-omni.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README-omni.txt b/README-omni.txt index ca624eee..b6e40535 100644 --- a/README-omni.txt +++ b/README-omni.txt @@ -854,7 +854,7 @@ Options: ~/.gcf/agg_nick_cache --AggNickDefinitiveLocation=AGGNICKDEFINITIVELOCATION Website with latest agg_nick_cache, default is - https://raw.githubusercontent.com/wiki/GENI-NSF/geni- + https://raw.githubusercontent.com/GENI-NSF/geni- tools/master/agg_nick_cache.base. To force Omni to read this cache, delete your local AggNickCache or use --NoAggNickCache. From 82cdeac39cf2b5d20ee734376fe061f1301a7b02 Mon Sep 17 00:00:00 2001 From: Aaron Helsinger Date: Fri, 11 Dec 2015 10:14:36 -0500 Subject: [PATCH 14/27] fill out some text for all sections, but boy is this rough --- doc/omni-design-notes.md | 179 +++++++++++++++++++++++++++++---------- 1 file changed, 134 insertions(+), 45 deletions(-) diff --git a/doc/omni-design-notes.md b/doc/omni-design-notes.md index 899c282e..eba221c1 100644 --- a/doc/omni-design-notes.md +++ b/doc/omni-design-notes.md @@ -1,5 +1,6 @@ This file contains some notes on the design and implementation of Omni. Many details are in the issues or the source code. This document may serve as a pointer, or explanation for the code you are reading. +'''NOTE''': This is a work in progress. This document has many holes and needs polishing. # Directory Contents @@ -53,6 +54,17 @@ src/: Put this directory on your PYTHONPATH framework_pg.py: Talk natively to ProtoGENI framework_sfa.py: Talk to SFA Slice Authority stitch/: Support code for Stitcher + objects.py: Define the Aggregate class which has the key allocate method, + plus classes representing parts of the RSpec. Much of stitcher is here. + ManifestRspecCombiner.py: Combine multiple manifests in a single rspec + RSpecParser.py: For parsing the request from the SCS + VLANRange.py: Utilities for parsing & printing ranges of VLANs (a set) + launcher.py: A loop over aggregates whose dependencies are satisfied, to call them in + turn to be allocated + scs.py: Utilities to call functions at the SCS + workflow.py: Parse the workflow from the SCS and calculated dependencies among aggregates + and path hops + GENIObject.py and gmoc.py: Some aborted work to use GMOC code for modeling util/: credparsing.py: Utilities to parse credentials and distinguish between XML credentials and JSON wrapped credentials (wrapped @@ -79,7 +91,8 @@ src/: Put this directory on your PYTHONPATH a handler. This is the base class. amhandler.py: Handle all AM API calls (like createsliver) chhandler.py: Handle calls to a clearinghouse (like createslice) - stitchhandler.py: Handle stitching calls + stitchhandler.py: Handle stitching calls, calling launcher and + the objects.py Aggregate classes as needed. sfa/: Code imported from SFA. Defines Certificates and Credentials and how to validate them. gcf_version.py: Define the current Omni version @@ -531,12 +544,11 @@ Fundamentally, stitcher does a series of reservations at aggregates using Omni. This process is made more complex by error handling. Any given reservation may fail, due perhaps to a problem in the request, unavailability of compute resources, or unavailability of the requested VLAN tag. Stitcher works hard to determine whether the request is fatally flawed, or whether some part of the reservation can be productively deleted and retried automatically. A number of other factors complicate stitching: * Some aggregates can translate VLAN tags (using 1 VLAN tag on the way in, and another on the way out), and some cannot -* Some aggregate prefer to select the VLAN tag (producers), and some want to be told what VLAN tag to use (consumers) +* Some aggregates prefer to select the VLAN tag (producers), and some want to be told what VLAN tag to use (consumers) * Stitched links request a given bandwidth (typically just a best effort bookkeeping reservation) that must be satisfied * A given slice may use multiple stitched links, and may use multiple inter aggregate link types * No GENI aggregates currently support multi point circuits, so slices must be made of multiple circuits - ## Stitching Links Some links for learning more about stitching in general and GENI stitching: * GENI Stitching and links to SCS code and the stitching extension: https://wiki.maxgigapop.net/twiki/bin/view/GENI/NetworkStitchingOverview @@ -551,21 +563,58 @@ Some links for learning more about stitching in general and GENI stitching: * PG stitching: http://www.protogeni.net/ProtoGeni/wiki/Stitching * Orca stitching: https://geni-orca.renci.org/trac/wiki/Stitching +## Stitcher todo items +Stitcher has never been refactored, and the code needs to be cleaned up. +Arguably stitcher could be refactored to support considering and using arbitrary dependencies among aggregates. +Stitcher hard codes a lot of knowledge of how aggregates work, making it brittle. Some pieces of this could be at least factored into config / data files. +* Error codes and messages from aggregates and what they mean +* Default sliver expiration times +* Whether an aggregate produces a good manifest immediately, or only after the sliver becomes ready (like EG, DCN) +* Whether an aggregate's manifest is cumulated (an edited request), or is new / limited (like EG). +* Whether an aggregate supports changing the suggested VLAN tag to `any` + +Stitching schema v2 is not used by aggregates. While stitcher claims to support this, there are likely lurking issues. + +The open issues cover most things that could/should be done. Some highlights: +* Allow specifying a VLAN to use on a link (#872) +* Fix up handling of stitching to a fixed endpoint (#840) +* Support resuming a partial reservation (#810) +* Check available bandwidth first (#809) +* Allow 2 hops with the same interface on a single hop (like a loop) (#784) +* Put more AM specifices in `omni_defaults` (#762) +* Reconcile the use of `any` and the SCS selected VLANs (#650) +* Refactor `stitcher.call` into `stitchhandler` for better library use (#649) +* Move some stitcher utilities and options into base Omni (#627, #655) +* Support full VLAN negotiation (#567) +* Clean up overlapping use of stitcher `amlist` and `--useSliceAggregates` (#585) +* Check status of Orca reservations (#318) +* Multithread where reasonable (#260) + * SCS - * where to find docs and code, who runs it (contact), who maintains - it (contact) - * running scs.py - * avail commands and their returns - * what is in the SCS and who controls - * error modes - * how stitcher uses it - * options/inputs that control when/how it is used +The Stitching Computation Service (SCS) is documented in README-stitching, and is an optional service to find paths across GENI. It was written by Tom Lehman and Xi Yang of MAX and U Maryland. It is operated by Internet2. See links above for design documents and source code. For issues with the running instance, contact the GMOC / Internet2. Interactions with the SCS are mediated by `scs.py`. That file contains a `main`, allowing direct testing of the SCS (be sure the set your `PYTHONPATH=/src`). Functions at the SCS include `ComputePath` (the main function stitcher uses) and `ListAggregates` (list the aggregate known to the SCS). `GetVersion` is a simple check if the server is up and what code version it is. Comments in the `main` list URLs for different SCS instances, and running `scs.py -h` will show usage of its `main()`. +The aggregate loaded in a given instance of the SCS will vary. It should include aggregates known to work with GENI stitching. As such, the list will be constrained by GENI Operations testing for the official Internet2 SCS instance; testing SCS instances may include additional aggregates. +The SCS operates by parsing aggregate advertisements and constructing topologies from that information. As such, it must be kept up to date with the latest ad RSpec, and errors in those RSpecs will cause problems. + +Note also that the SCS, by design, does not consider current VLAN tag availability - only advertised ranges. Therefore it will report a possible VLAN range and suggested tag that may not currently work. Stitcher considers availability (where known) to filter or change that suggested information itself. + +At runtime, stitcher calls the SCS when it determines that 1 or more links require using GENI stitching. The SCS then adds a stitching extension to the request RSpec, specifying the hops (switch and port) in sequence that define the circuit, along with suggested VLAN tags to request. In addition, the SCS calculates which aggregate should be asked to pick the VLAN tag, and which aggregates should be told the VLAN tag selected by the previous aggregate. This workflow information is used to drive stitcher. +When stitcher requests a path from SCS for which there is no configuration, or there is no overlap in VLAN tags configured, then the SCS returns a path not found error. + +The SCS is optional, in that a tool could use some other mechanism for finding a path and possible VLAN tags, but the SCS is the mechanism stitcher uses. + +Several stitcher options control the use of the SCS. +* `--excludehop` allows the experimenter to request that a given interface (switch-port), by URN, not be used on any path/circuit. By appending `=` you can exclude a specific VLAN tag or range of VLAN tags. Use this to avoid some hop or VLAN that you know has problems, or to effectively force the use of some other tag. +* `--includehop`: Include this hop on EVERY path +* `--includehoponpath`: Include the specified hop on the specified path (link `client_id`) +* `--scsURL`: URL of the SCS. Used to specify a non default (say, testing) SCS +* `--noSCS`: Do not call the SCS. Use this if supplying a request that already has a stitching extension and the SCS would fail the request +* `--useSCSSugg`: Use the SCS suggested VLAN tag, and do not change the request to `any` at supported aggregates * AL2S - * What it is and how it is used - * who runs/maintains (contact) - * where to find code - * OESS +The GENI network uses the AL2S (OESS) backbone from Internet2 to connect most GENI aggregates. This network supports dynamic circuits, uses Openflow under the covers, and gives GENI dedicated VLANs for each experimenter request. Contact Internet2 / GMOC with any operational problems with AL2S. Internet2 operates a GENI aggregate manager for reserving circuits across AL2S. +The AL2S aggregate is based on FOAM (https://bitbucket.org/barnstorm/foam). The base code is roughly that at: +https://bitbucket.org/ahelsing/foam-0.12-with-speaks-for +It was written by Luke Fowler of Indiana University / Internet2. * stitchhandler, launcher, objects.py * pseudo code control flow @@ -582,37 +631,77 @@ Some links for learning more about stitching in general and GENI stitching: * refactoring for managability / maintainability -# tools +# Tools +There are multiple support script included with geni-tools under `src` and `examples`. +## readyToLogin +Use `sliverstatus` and the manifest to determine when compute resources are ready for use, and report the proper SSH commandline. See github for open issues. +## omni-configure +Run this on the Omni configuration bundle downloaded from the GENI portal to set up SSH and SSL keys and the omni.config file needed to run Omni. +## clear-passpharses +Remove the passphrase from an SSL key +## deleteSliceCred +Slice credentials can be delegated. A delegated slice credential may be a subset of the permissions in theory, though in practice all credentials allow doing anything. When using a delegated credential, the actor appears to be the owner of the resources and is responsible, as opposed to speaks for, where the original user retains responsibility. This script allows generating a delegated slice credential. +## addMemberToSliceAndSlivers +Update slice membership at the CH (not supported by all CHs) and then use the slice membership to install SSH keys (as listed by the CH) on the slivers, using the `poa` command. Note supported at all aggregates. +## experiationofmyslices +Essentially `print_sliver_expiration` on all slices listed at the CH +## remote-execute +Essentially using SSH to execute a command on multiple nodes +## renewSliceAndSlivers +Use this for instance in a cron job to auto renew a long lived slice. This script does not do a good job at checking error returns or reporting on script results. # gcf -* What it is -* m2crypto vs pyopenssl -* following the AM API (shortcomings) - * gram -* doesn't follow the federation API but should -* gcf-test -* using with omni -* cred_utils and speaks for - * how it is used, what it does, what it doesn't do - -authorization engine -* point to readme -* docs on why - -scheduling support -* point to readme - -acceptance -* what it is, where it is, pointers to using it -* incomplete -* doesn't do v3 +GCF refers to the gcf sample aggregate and clearinghouse. The sample clearinghouse (run using `gcf-ch`) is extremely trivial, providing no persistence and only basic functionality. It does not run the Uniform Federation API - this would be a good improvement. +The sample aggregate (run using `gcf-am`) implements the GENI AM API. There are versions for each AM API version. This aggregate has no persistence and no real resources. However, there are multiple efforts to use this as the basis of real aggregates. The primary benefit of this foundation is the definition of the AM API functions and the authorization support. For one example based on the GCM AM, see https://github.com/GENI-NSF/gram +Note that there are limits to the AM API support of this GCF AM, such as some of the newer APIv4 changes. + +You can do basic tests that the GCF AM/CH are working using `gcf-test`. Omni can talk to the GCF CH, and of course to the AM as it is just another aggregate; use `type=gcf` in your `omni_config`. + +`gen-certs.py` can be used to generate some testing certificates for the GCF CH and AM, and a test user or 2. + +The GCF code sits under `src/gcf/geni`. + +## Credential utilities +`src/gcf/geni/util/cred_util.py` contains utilities for validating credentials and determining if a credential provides the needed rights for the caller to invoke a method. The `CredentialVerifier` reads the list of trust roots, and provides the `verify_from_strings` method that the gcf-am uses. This function also handles speaks for. This same file also provides a utility for creating a credential. + +## Speaks For +Also included within the GCF code directory is support for Speaks For. For more information on Speaks For, see +* http://groups.geni.net/geni/wiki/GAPI_AM_API_DRAFT/Adopted#ChangeSetP:SupportproxyclientsthatSpeakForanexperimenter +* http://groups.geni.net/geni/wiki/TIEDABACCredential +* http://abac.deterlab.net/ +Speaks for allows a tools to act on behalf of an experimenter, while the experimenter retains responsibility for the actions. It is conferred using a special credential that contains an ABAC statement. +geni-tools provides utilities for creating and validating speaks for credentials in `src/gcf/geni/utils/speaksfor_util.py`. That file provides a `main()` (be sure to set `PYTHONPATH=geni-tools-dir/src`) whose `-h` message provides more usage information. Runtime callers use `determine_speaks_for` which returns a certificate: either that of caller of the XMLRPC method if this was not a valid speaks-for call, or the certificate of the real user instead of the caller/tool, if this was a valid speaks-for invocation. + +## Authorization engine +See README-authorization.txt + + +## Scheduling support +See README-schedulting.txt + + +# Acceptance tests +geni-tools comes with some basic tests for checking that an aggregate complies with the GENI AM API. See `acceptance_tests/AM_API/README-accept-AMAPI.txt`. +These tests are not complete and have not been updated for recent additions / modifications to the AM API. +They are however a good start for aggregate developers. # SFA -- we use some of their files. See src/gcf/sfa. -Thierry Parmentelat -Tony Mack -- Start at merging latest is here: https://github.com/ahelsing/geni-tools/tree/tkt854-newsfa -- credential.xsd really should be posted by geni.net, but -isn't. Unclear what the trust/verification effect would be of a -change. Note that it would require changing the namespace. -http://git.planet-lab.org/?p=sfa.git +For validating and generating certificates and credentials, geni-tools uses code from the PlanetLab Slice Federation Architecture (SFA). See http://git.planet-lab.org/?p=sfa.git +For details on what is used, the license, and how it is used, see `src/gcf/sfa`. +Our contacts at SFA are: +* Thierry Parmentelat +* Tony Mack +The latest SFA code has not been integrated. See ticket #854, and a start at this integration at : https://github.com/ahelsing/geni-tools/tree/tkt854-newsfa + +Credentials follow a schema. GENI uses a schema that is at http://www.planet-lab.org/resources/sfa/credential.xsd +Note that ProtoGENI has a version of this (same content, different namespace. +Ideally, GENI would use a version that is hosted at geni.net, but it is unclear what issues with verification / trust this would cause. Note that the namespace in such a schema would need to be changed. + +GENI also uses the SFA mechanism for assigning rights. In practice, all useful rights are included in any credential, but a possible future enhancement would be to change to more reasonable rights - ones that better map to actual operations, allowing giving different rights in different credentials. + +SFA makes use of M2Crypto, PyOpenSSL, and xmlsec. As a result, Omni depends on all these. xmlsec is used to sign and validate XML digital signatures. +* https://www.aleksey.com/xmlsec/ +* https://gitlab.com/m2crypto/m2crypto + +M2Crypto is old an has issues, and the use of both M2Crypto and PyOpenSSL is unfortunate. It would be nice to eliminate some of this. + From 982f5954d02df5f22b71b03665739e090bc6adcd Mon Sep 17 00:00:00 2001 From: Aaron Helsinger Date: Fri, 11 Dec 2015 10:27:14 -0500 Subject: [PATCH 15/27] formatting --- doc/omni-design-notes.md | 74 +++++++++++++++++++++++++--------------- 1 file changed, 47 insertions(+), 27 deletions(-) diff --git a/doc/omni-design-notes.md b/doc/omni-design-notes.md index eba221c1..d595de59 100644 --- a/doc/omni-design-notes.md +++ b/doc/omni-design-notes.md @@ -1,6 +1,6 @@ This file contains some notes on the design and implementation of Omni. Many details are in the issues or the source code. This document may serve as a pointer, or explanation for the code you are reading. -'''NOTE''': This is a work in progress. +**NOTE**: This is a work in progress. This document has many holes and needs polishing. # Directory Contents @@ -251,11 +251,12 @@ Omni keeps a cache of aggregate nicknames, by default in `~/.gcf/agg_nick_cache`. This INI format file maps nicknames to aggregate URL and URN. Note that the same URN may have multiple URLs (different AM API versions typically), and the same URL could have -multiple nicknames. The cache is maintained in git and posted on the -Omni wiki (currently at https://raw.githubusercontent.com/wiki/ahelsing/geni-tools/agg_nick_cache). Omni downloads the cache once daily (configurable). Nicknames in the cache +multiple nicknames. The cache is maintained in git and available at https://raw.githubusercontent.com/GENI-NSF/geni-tools/master/agg_nick_cache.base. Omni downloads the cache once daily (configurable). Nicknames in the cache are ordered by convention with AM API agnostic nicknames before those specific to a version, and then by API version number. Nicknames are -typically `-[version#]`, e.g. "moxi-of1". For some purposes, +typically `-[version#]`, e.g. "moxi-of1". + +For some purposes, Omni takes a nickname and looks up the aggregate URN and URL. For other purposes, Omni starts with a URL or URN and looks up the nickname for prettier log messages. When doing so, Omni uses some @@ -270,7 +271,9 @@ up-to-date. In particular, when omni users use the clearinghouse to get AM URNs that are registered as having resources on this slice. Then Omni must look up a URL for that URN, and uses the agg_nick_cache to do so. Therefore, any AM that is not listed in the -agg_nick_cache will not be included in Omni operations that use `--useSliceAggregates`. GENI operations must keep the `agg_nick_cache` up to date with the proper AM URLs and list the proper aggregates, to ensure sliver info reporting, availability of reasonable nicknames, and reasonable Omni printouts. Generally, any aggregate that conforms to the AM API and provides reservable resources could be listed in the cache, but GENI policy may require additional testing (reliability for example). +agg_nick_cache will not be included in Omni operations that use `--useSliceAggregates`. + +GENI operations must keep the `agg_nick_cache` up to date with the proper AM URLs and list the proper aggregates, to ensure sliver info reporting, availability of reasonable nicknames, and reasonable Omni printouts. Generally, any aggregate that conforms to the AM API and provides reservable resources could be listed in the cache, but GENI policy may require additional testing (reliability for example). Note that there are options for controlling where the cache is saved, and options to force not attempting to download a new cache at all. Also note that much of the information in the `agg_nick_cache` is duplicated in the GENI Clearinghouse' service registry. It might be nice if this data could be retrieved from that registry or some similar database, reducing the number of sources of such information. @@ -287,10 +290,12 @@ there would not yet be sliver info records or the records would not be useful; when calling createsliver, you do not want to reserve resources at the AMs where there is already a reservation, as that will fail. + Given the slice name, `_listaggregates` gets the AM URNs from the sliver_info records at the clearinghouse, if possible (only at CHAPI compatible clearinghouses). Omni then retrieves the AM URL and nickname if possible, avoiding duplicate entries. + If the options do not require using the sliver_info records, then Omni considers the `-a` options, again looking up the url and urn for the aggregate nickname (or urn or url). Failing that, Omni uses the @@ -323,7 +328,8 @@ based on that name. ## `amhandler` helpers and details amhandler includes a large number of helper functions to support its operations and simplify the individual methods. -### BadClientException + +### `BadClientException` This helper exception is used to signal that Omni called an AM that spoke the wrong version of the AM API, or is otherwise not callable (see `self._api_call`). Then the calling methods (e.g. `Describe`) can note the failure in the return message, bail if that's the only AM, or continue to the next aggregate. @@ -375,7 +381,7 @@ Build the AM API `options` argument for this method call and the specified comma This includes `geni_end_time`, `geni_start_time`, `geni_best_effort`, `geni_speaking_For`, `geni_extend_alap`, and any arbitrary options specified in the `--optionsfile` JSON file of options. For an example of those options, see http://groups.geni.net/geni/wiki/HowTo/ShareALan or http://groups.geni.net/geni/wiki/GAPI_AM_API_DRAFT/Adopted#ChangeSetQ:Supportchangingusersandkeysonexistingcomputeslivers This method knows what options are relevant in what AM API methods. As such, it is brittle. `devmode` can be used to force passing options to additional method calls. -### API API v2 vs v3 functions +### AM API v2 vs v3 functions Omni tries to stop you from calling an AM API v2 method at an AM API v3 AM. `devmode` allows you to do so anyhow. Note however the interaction with `_correctAPIVersion` which could cause unexpected results; in practice, this does this right thing. ### `self._build_urns` @@ -384,12 +390,16 @@ For use with AM API v3+, this function builds the urns argument to AM API calls. ### `self._retrieve_value` AM API methods return a triple (`code`, `output`, `value`), and Omni helps extract the real result from this, or a reasonable error message. This method considers also the SSL call return message, if any. This function also attempts to extract any PG based AMs log URL (a URL where full logs of teh call at the AM are available). Omni provides an option to raise an error (an `AMAPIError` with the the return triple) if there is an AM API error return code when using AM API v2: `--raise-error-on-v2-amapi-error`. Otherwise, this method returns an error string or the return value. -### sliver_info records +### `sliver_info` records The Uniform Federation API specifies a 'sliver info' mechanism, by which tools or aggregates can voluntarily provide sliver records to the clearinghouse. These records record which aggregates have resources reserved for what slices, and when they expire. This information is useful for inferring what aggregates to talk to when acting on a slice. Omni uses this information when you use the `--useSliceAggregates` option and the `framework_chapi` clearinghouse interface. + When using the `framework_chapi`, Omni tries to report this information to the clearinghouse: new slivers reserved (`createsliver` or `provision`), slivers renewed (`renewsliver` or `renew`) or slivers deleted (`deletesliver`, `delete`). Additionally, Omni ensures the records are correct when you call `sliverstatus` or `status`. Since this is also used by the GENI Portal and GENI Desktop, most GENI reservations are properly reported to the GENI clearinghouse. (Reservations made using other clearinghouses will of course not be recorded.) Note that allocated slivers are not reported. Also note that Omni attempts to continue if there is an error with reporting, which could result in mis-matches. + Omni tries to get the proper sliver expiration times. This logic may have errors (where sliver expiration is not reported correctly, or is missing as in some returns from `createsliver`). In such cases, Omni may correct this in a later call, or the expiration may be that of the slice, and therefore the resource may expire sooner than listed; generally this is not harmful. + Additionally, Omni needs a good sliver URN to report. At some AMs, this has been problematic in the past. Omni includes heuristics to determine or generate a sliver URN, and to try to match such generated URNs with later reported URNs. This too could cause problems. Users may disable sliver info reporting using `--noExtraCHCalls`. + As noted elsewhere, to use these sliver info records, Omni must determine the URN of the aggregate. Omni tries to look up the aggregate URN if it is not available (using the aggregate nickname cache or the clearinghouse or the GetVersion cache), or to guess it from the sliver URN. None of these mechanisms is foolproof, and as such, some resource reservations may not be reported. In general, all aggregates should be listed in the `agg_nick_cache` to ensure the sliver info mechanism works. ### amhandler sliver result parsing functions @@ -397,13 +407,14 @@ Starting with AM API v3, many functions return a struct or list of structs for t ## `do_ssl` As noted above, `dossl.py` provides the `_do_ssl` wrapper around SSL calls. This allows catching common SSL errors and retrying; for example, mis-typing your SSL key passphrase, or a server reporting an AM API error code indicating it is busy. The number of times to retry and time to pause between attempts is hard coded (4 times, 20 seconds). Other common SSL errors are interpreted to provide a more user friendly error message (such as your user certificate is expired or not trusted). This function also allows suppressing certain error codes - allowing this to look like an empty return with an error message, instead of logging a noisy error. + The tuning of time to wait between busy retries and number of times to retry has been tuned to support the current slowest AMs (like ProtoGENI Utah). But this is brittle and could need future tuning. -## logging +## Logging Omni uses python logging. Omni provides multiple options to tune and configure logging, attempting to be friendly to the use of Omni as a library in another application. Some user level documentation is available in `README-omni`. Some times, configuring logging as desired requires manually modifying the python handlers in the calling code. For example, stitcher does things like this: -``` +```python ot = self.opts.output if not self.opts.tostdout: self.opts.output = True @@ -434,7 +445,7 @@ Some times, configuring logging as desired requires manually modifying the pytho ``` Similar things suppress all but warnings on the console: -``` +```python if not self.opts.debug: # Suppress all but WARN on console here lvl = self.logger.getEffectiveLevel() @@ -466,12 +477,14 @@ Another good example is how Stitcher configures logging. `src/stitcher.py` finds ## Saved user and slice creds Many CH operations require a user credential. Most AM API methods require a user credential or usually a slice credential. These credentials change very infrequently. So Omni can save these, letting you do many things faster. A future enhancement would automatically cache these. + When you use the `-o` option with `getusercred` or `getslicecred`, you can save the credential. Then through use of `--slicecredfile` or `--usercredfile` you can have Omni load the credential from the saved file. `framework_base.init_user_cred` tries to read a saved user credential from a file. `handler_utils._maybe_save_slicecred` is used to save the slice credential to a file. `handler_utils._get_slice_cred` will call `_load_cred` to load the slice credential from a file if possible. Stitcher uses the saved slice credential so that the numerous individual Omni calls required for a single stich all use the same saved slice credential. `chhandler` has to be a little careful, particularly in calling `renewslice` and `getslicecred` when there is a saved slice credential. ## Making SSL connections There are multiple ways of making SSL connections from python. geni-tools uses some M2Crypto and some PyOpenSSL. `secure_xmlrpc_client.py` and `xmlrpc/client.py` use PyOpenSSL. There was an attempt to use M2Crypto, particularly to support a callback for entering the SSL passphrase only once, but this had trouble. Unused code remains for future potential use. + Note that managing the SSL version and the ciphers used in creating the SSL connection has been an issue in the past. There are notes on github issues. In particular, remember that Omni should work on Windows and Mac as well as Linux, and there are a wide variety of servers it must talk to. Also note that Omni wants to authenticate with a client certificate over SSL, which is unusual among python libraries. In addition, it must pass a full chain of certificates in general (an MA and a user cert). And do this with an XMLRPC connection. Ensuring the cert chain is passed, and that SSL timeouts are honored, has been an issue in the past. Additionally, Omni attempts to work with Python 2.6 and 2.7, including more recent 2.7.9. These various versions introduce differences that Omni must work around. @@ -525,17 +538,18 @@ Overall, it has been a couple years since Omni was refactored. It is time. When Other possible improvements are noted inline above. -## show create sliver pseudo code to walk much of the sub systems +FIXME: show create sliver pseudo code to walk much of the sub systems? - -# stitcher +# Stitcher Stitcher is a tool that uses Omni to coordinate reservations among multiple aggregates. For usage information, see README-stitching.txt. Stitcher uses the Omni option parser and logging configuration, and then does multiple instances of `omni.call()` to invoke numerous AM API calls. ## Stitching Overview GENI stitching breaks up the reservation of coordinated slices into individual reservations at multiple aggregates. Each aggregate simply reserves what is requested of it. It is the responsibility of the tool to coordinate those reservations as necessary. For example, the tool may reserve a link at Aggregate A, and Aggregate A will provide that link. It is up to the tool to reserve the other end of that link at Aggregate B. If the tool does not do so, nothing useful will happen on that link, but Aggregate A does not care. However, a good tool would look at the specific link allocated by Aggregate A, and ensure it reserves the matching link at Aggregate B; for example, using the same VLAN tag number. + In general, there could be multiple reasons why the reservation at a second aggregate depends on what is reserved at the first aggregate. The Stitcher tool handles the case of using the same VLAN tag at multiple aggregates. GENI provides multiple mechanisms for creating links between resources at multiple aggregates: GRE and EGRE links, specialized aggregates like VTS, and VLAN circuits. Stitcher focuses primarily on VLAN circuits, and that is what we refer to when we speak of GENI Stitched links. + GENI provides experimenters a private custom topology by using VLAN tags across the GENI network. Experimenters can then modify anything within their layer 2 network. Stitching works because GENI operators pre-negotiate a range of VLANs across campus, regionals, and backbone providers to be dedicated to GENI and the ports connecting GENI resources. These pools of VLANs are then managed by GENI aggregates. GENI stitching then involves the coordinated reservation of those VLAN tags across a circuit of aggregates/resources. One variation on GENI stitching, is the creation of Openflow controlled stitcher circuits. In this variation, the aggregates give the slice a VLAN on the switch, but also connect a designated Openflow controller to that VLAN circuit, allowing the experimenter to control traffic on their VLAN using their Openflow controller. Experimenters can do this using the normal stitching mechanism, but specifying an Openflow controller within the main body ``. More properly, experimenters would use version 2 of the stitching RSpec extension which allows specifying the Openflow controller as part of the stitching request. @@ -590,9 +604,10 @@ The open issues cover most things that could/should be done. Some highlights: * Check status of Orca reservations (#318) * Multithread where reasonable (#260) -* SCS +## SCS The Stitching Computation Service (SCS) is documented in README-stitching, and is an optional service to find paths across GENI. It was written by Tom Lehman and Xi Yang of MAX and U Maryland. It is operated by Internet2. See links above for design documents and source code. For issues with the running instance, contact the GMOC / Internet2. Interactions with the SCS are mediated by `scs.py`. That file contains a `main`, allowing direct testing of the SCS (be sure the set your `PYTHONPATH=/src`). Functions at the SCS include `ComputePath` (the main function stitcher uses) and `ListAggregates` (list the aggregate known to the SCS). `GetVersion` is a simple check if the server is up and what code version it is. Comments in the `main` list URLs for different SCS instances, and running `scs.py -h` will show usage of its `main()`. -The aggregate loaded in a given instance of the SCS will vary. It should include aggregates known to work with GENI stitching. As such, the list will be constrained by GENI Operations testing for the official Internet2 SCS instance; testing SCS instances may include additional aggregates. + +The aggregates loaded in a given instance of the SCS will vary. It should include aggregates known to work with GENI stitching. As such, the list will be constrained by GENI Operations testing for the official Internet2 SCS instance; testing SCS instances may include additional aggregates. The SCS operates by parsing aggregate advertisements and constructing topologies from that information. As such, it must be kept up to date with the latest ad RSpec, and errors in those RSpecs will cause problems. Note also that the SCS, by design, does not consider current VLAN tag availability - only advertised ranges. Therefore it will report a possible VLAN range and suggested tag that may not currently work. Stitcher considers availability (where known) to filter or change that suggested information itself. @@ -610,12 +625,13 @@ Several stitcher options control the use of the SCS. * `--noSCS`: Do not call the SCS. Use this if supplying a request that already has a stitching extension and the SCS would fail the request * `--useSCSSugg`: Use the SCS suggested VLAN tag, and do not change the request to `any` at supported aggregates -* AL2S +## AL2S The GENI network uses the AL2S (OESS) backbone from Internet2 to connect most GENI aggregates. This network supports dynamic circuits, uses Openflow under the covers, and gives GENI dedicated VLANs for each experimenter request. Contact Internet2 / GMOC with any operational problems with AL2S. Internet2 operates a GENI aggregate manager for reserving circuits across AL2S. The AL2S aggregate is based on FOAM (https://bitbucket.org/barnstorm/foam). The base code is roughly that at: https://bitbucket.org/ahelsing/foam-0.12-with-speaks-for It was written by Luke Fowler of Indiana University / Internet2. +## Sections to add * stitchhandler, launcher, objects.py * pseudo code control flow * logging @@ -623,34 +639,36 @@ It was written by Luke Fowler of Indiana University / Internet2. * alternatives with more direct calls * funniness messing with loggers to suppress some calls * workflow parsing and how workflow is calculated/used -* developer options -* to do items - * factor so can use as library - * factor so can add other things to workflow, other dependencies - * extract out AM specifics more - * refactoring for managability / maintainability - +* developer options # Tools There are multiple support script included with geni-tools under `src` and `examples`. + ## readyToLogin Use `sliverstatus` and the manifest to determine when compute resources are ready for use, and report the proper SSH commandline. See github for open issues. + ## omni-configure Run this on the Omni configuration bundle downloaded from the GENI portal to set up SSH and SSL keys and the omni.config file needed to run Omni. + ## clear-passpharses Remove the passphrase from an SSL key + ## deleteSliceCred Slice credentials can be delegated. A delegated slice credential may be a subset of the permissions in theory, though in practice all credentials allow doing anything. When using a delegated credential, the actor appears to be the owner of the resources and is responsible, as opposed to speaks for, where the original user retains responsibility. This script allows generating a delegated slice credential. + ## addMemberToSliceAndSlivers Update slice membership at the CH (not supported by all CHs) and then use the slice membership to install SSH keys (as listed by the CH) on the slivers, using the `poa` command. Note supported at all aggregates. + ## experiationofmyslices Essentially `print_sliver_expiration` on all slices listed at the CH + ## remote-execute Essentially using SSH to execute a command on multiple nodes + ## renewSliceAndSlivers Use this for instance in a cron job to auto renew a long lived slice. This script does not do a good job at checking error returns or reporting on script results. -# gcf +# GCF GCF refers to the gcf sample aggregate and clearinghouse. The sample clearinghouse (run using `gcf-ch`) is extremely trivial, providing no persistence and only basic functionality. It does not run the Uniform Federation API - this would be a good improvement. The sample aggregate (run using `gcf-am`) implements the GENI AM API. There are versions for each AM API version. This aggregate has no persistence and no real resources. However, there are multiple efforts to use this as the basis of real aggregates. The primary benefit of this foundation is the definition of the AM API functions and the authorization support. For one example based on the GCM AM, see https://github.com/GENI-NSF/gram Note that there are limits to the AM API support of this GCF AM, such as some of the newer APIv4 changes. @@ -669,6 +687,7 @@ Also included within the GCF code directory is support for Speaks For. For more * http://groups.geni.net/geni/wiki/GAPI_AM_API_DRAFT/Adopted#ChangeSetP:SupportproxyclientsthatSpeakForanexperimenter * http://groups.geni.net/geni/wiki/TIEDABACCredential * http://abac.deterlab.net/ + Speaks for allows a tools to act on behalf of an experimenter, while the experimenter retains responsibility for the actions. It is conferred using a special credential that contains an ABAC statement. geni-tools provides utilities for creating and validating speaks for credentials in `src/gcf/geni/utils/speaksfor_util.py`. That file provides a `main()` (be sure to set `PYTHONPATH=geni-tools-dir/src`) whose `-h` message provides more usage information. Runtime callers use `determine_speaks_for` which returns a certificate: either that of caller of the XMLRPC method if this was not a valid speaks-for call, or the certificate of the real user instead of the caller/tool, if this was a valid speaks-for invocation. @@ -677,7 +696,7 @@ See README-authorization.txt ## Scheduling support -See README-schedulting.txt +See README-scheduling.txt # Acceptance tests @@ -691,6 +710,7 @@ For details on what is used, the license, and how it is used, see `src/gcf/sfa`. Our contacts at SFA are: * Thierry Parmentelat * Tony Mack + The latest SFA code has not been integrated. See ticket #854, and a start at this integration at : https://github.com/ahelsing/geni-tools/tree/tkt854-newsfa Credentials follow a schema. GENI uses a schema that is at http://www.planet-lab.org/resources/sfa/credential.xsd @@ -703,5 +723,5 @@ SFA makes use of M2Crypto, PyOpenSSL, and xmlsec. As a result, Omni depends on a * https://www.aleksey.com/xmlsec/ * https://gitlab.com/m2crypto/m2crypto -M2Crypto is old an has issues, and the use of both M2Crypto and PyOpenSSL is unfortunate. It would be nice to eliminate some of this. +M2Crypto is old and has issues, and the use of both M2Crypto and PyOpenSSL is unfortunate. It would be nice to eliminate some of this. From f01ee77df1d885fe78d28e07fd6d1bd73736b35c Mon Sep 17 00:00:00 2001 From: Aaron Helsinger Date: Fri, 11 Dec 2015 11:04:07 -0500 Subject: [PATCH 16/27] fleshing out more --- doc/omni-design-notes.md | 26 ++++++++++++++++++++++---- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/doc/omni-design-notes.md b/doc/omni-design-notes.md index d595de59..137669aa 100644 --- a/doc/omni-design-notes.md +++ b/doc/omni-design-notes.md @@ -633,13 +633,31 @@ It was written by Luke Fowler of Indiana University / Internet2. ## Sections to add * stitchhandler, launcher, objects.py -* pseudo code control flow -* logging -* use of omni via omni.call +* Pseudo code control flow +* Logging +Stitcher uses a complicated Pythong logging config file to force all log messages (including debug) to a file (`stitcher.log`) while the console has a much more limited set of log messages. Doing this requires to messy handler manipulation and clever use of Omni logging configuration. Stitcher also does its own per-invocation log file rotation. Stitcher has an option to push all output files into a named directory (supporting multiple invocations on the same server). FIXME. +* Calling Omni +Stitcher makes multiple omni method calls. It does so by constructing strings or lists of strings for Omni to parse, and invoking `omni.call`. That's inefficient, and refactoring some things in Omni would make this cleaner. * alternatives with more direct calls * funniness messing with loggers to suppress some calls * workflow parsing and how workflow is calculated/used -* developer options +* Stitcher decides if the request is a stitching request based on some heuristics about link types and number of aggregates on a link. That determines if it calls the SCS. +* Developer options +* AM error codes +To add a new error code / message that stitcher should handle, see objects.py around line 2067. The key questions are whether you mark it `isFatal` (don't bother retrying locally) or `isVlanAvailableIssue` (try to look for another VLAN) or nothing, and what error message is printed. + +## `objects.py` +This file defines a number of basic objects. The primary one is the `Aggregate` class that represents an aggregate. This has the key method `allocate`. An Aggregate instance stores things like the type of AM, the AM API version to speak, the URN and URL, the paths it is on, the hops it provides, its dependencies, whether there is a reservation, the request and manifest DOM instances, etc. + +* See `Aggregate.supportsAny` which hard codes which AM types can take a suggested vlan tag of `any` +* `Aggregate.getExpiresForRequest` knows about the different AM types that have different expirations and uses the `defs.py` which in turn checks `omni_defaults` in the `omni_config` to find out when slivers will initially expire. +* `Aggregate.editEGRequest` edits ExoGENI URNs so that EG AMs don't have errors trying to process parts of the request for them that are really for another EG AM. +* `Aggregate.doAvail` knows which AM types provide valid VLAN tag availability information from `listresources` when called with the `--available` option +* `Aggregate.urn_syns_helper` knows about the multiple URN forms that can refer to the same AM (like `+cm` vs `+am` or `vmsite` vs `net`). +* `Aggregate` has multiple constants, like the number of times to retry +* This file is in serious need of refactoring. + +FIXME: Say more about the key methods and data structures # Tools There are multiple support script included with geni-tools under `src` and `examples`. From 3bf4a790f28f360964c0ca9cd886b5b853a7183d Mon Sep 17 00:00:00 2001 From: Aaron Helsinger Date: Fri, 11 Dec 2015 11:08:25 -0500 Subject: [PATCH 17/27] restore backslash in installer message on install steps --- windows_install/infoAfterFile.rtf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/windows_install/infoAfterFile.rtf b/windows_install/infoAfterFile.rtf index 0dc7e3bd..35dcc235 100644 --- a/windows_install/infoAfterFile.rtf +++ b/windows_install/infoAfterFile.rtf @@ -15,7 +15,7 @@ \ql \li0\ri0\nowidctlpar\wrapdefault\faauto\rin0\lin0\itap0 \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\b\f1\insrsid16532973 Configuration \par }{\f1\fs20\insrsid16532973 \par For instructions on how to }{\f1\fs20\insrsid16532973 Configure}{\f1\fs20\insrsid16532973 omni, please see: -\par https://github.com/GENI-NSF/geni-tools/wiki}{\f1\fs20\insrsid16532973 Windows}{\f1\fs20\insrsid16532973 +\par https://github.com/GENI-NSF/geni-tools/wiki/}{\f1\fs20\insrsid16532973 Windows}{\f1\fs20\insrsid16532973 \par \par }{\b\f1\insrsid16532973 More Information \par }{\f1\fs20\insrsid16532973 @@ -25,4 +25,4 @@ \par Or ask questions on the GENI Users mailing list: \par https://groups.google.com/forum/#!forum/geni-users \par -\par }} \ No newline at end of file +\par }} From 07e28012cffe81725c2b0f387b1bc6277b86dbd2 Mon Sep 17 00:00:00 2001 From: Aaron Helsinger Date: Fri, 11 Dec 2015 12:07:28 -0500 Subject: [PATCH 18/27] adding some on workflow --- doc/omni-design-notes.md | 45 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/doc/omni-design-notes.md b/doc/omni-design-notes.md index 137669aa..79ba5a54 100644 --- a/doc/omni-design-notes.md +++ b/doc/omni-design-notes.md @@ -563,6 +563,8 @@ This process is made more complex by error handling. Any given reservation may f * A given slice may use multiple stitched links, and may use multiple inter aggregate link types * No GENI aggregates currently support multi point circuits, so slices must be made of multiple circuits +Stitcher is written so that it handles any Omni calls that it can, and redirects to Omni for anything it cannot handle. + ## Stitching Links Some links for learning more about stitching in general and GENI stitching: * GENI Stitching and links to SCS code and the stitching extension: https://wiki.maxgigapop.net/twiki/bin/view/GENI/NetworkStitchingOverview @@ -631,6 +633,49 @@ The AL2S aggregate is based on FOAM (https://bitbucket.org/barnstorm/foam). The https://bitbucket.org/ahelsing/foam-0.12-with-speaks-for It was written by Luke Fowler of Indiana University / Internet2. +## Workflow +1. Configure logging and set up options +* Find `stitcher_logging.conf`, which is more complicated due to windows binaries +* Create needed directories and set up logging output +* Rotate `stitcher.log` so we keep up to 5 old log files +* Configure logging using Omni +* Suppress anything but WARN messages on the console while we load the omni config file, by editing the level on the console log handler. Note this is sensitive to the setup of the logging configuration file. +* Merge use of the omni `-p` option the the stitcher `--fileDir` option +* Call stitchhandler +2. Set up Stitch Handler +* Initilize the Omni framework. Suppress all but WARN console messages when doing so +* Set the `timeoutTime` to track when Stitcher should give up +3. Parse arguments +* Select functions by name that stitcher can handler that aren't allocations, like `describe` and `delete` + * Construct the aggregates to act on for those methods + * Use the stitcher saved AM list first + * If that gives none, use `--useSliceAggregates` + * If there is just one aggregate, pass this to Omni + * If this is `describe`, do `rebuildManifest` (see below) + * Otherse, `doDelete()` (see below) +* If this is not `allocate` or `createsliver`, then pass this to Omni (adding aggregates from the amlist file) +4. Parse the RSpec (see `RSpecParser`) +5. Check the kind of request this is +* `mustCallSCS` + * Make sure all links explicitly list the aggregates implied, by searching through the nodes for the interfaces on the link + * If the link has more than 1 aggregate, is the `vlan` type, and doesn't use a shared VLAN, it is stitching. Note that this heuristic is brittle. + * Check by aggregate URN if the aggregates on this link are all ExoGENI. If so, we could just use ExoGENI stitching (no SCS needed). But if the users said `--noEGStitching` in some form or `--noExoSM`, then we choose to use the SCS anyhow +* `hasGRELink` + * If there is a link of type `gre` or `egre` with 2 aggregates / 2 interfaces, then it is a GRE link +* Check for any unbound nodes and ensure the list of aggregates to process includes all aggregates hosting nodes +* If this is not a fully bound multi aggregate request, pass the call to Omni +6. Set up other singletons +* Get the slice credential: We get it once for re-use later +* Create the SCS interface +7. Call the main stitching loop (see below) to reserve the resources - see `mainStitchingLoop` +8. Create and save the combined manifest: `getAndSaveCombinedManifest` +9. Get pretty messages about when resources expire: `getExpirationMessage` +10. Save the list of aggregates used in this slice in a file for later use by stitcher +11. Clean up temporary files +12. Construct a return message and return + +FIXME FIXME..... + ## Sections to add * stitchhandler, launcher, objects.py * Pseudo code control flow From 7a64c758e5c6480182fe07746f68aed29fd3ccda Mon Sep 17 00:00:00 2001 From: Aaron Helsinger Date: Fri, 11 Dec 2015 12:10:50 -0500 Subject: [PATCH 19/27] fix typo --- doc/omni-design-notes.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/omni-design-notes.md b/doc/omni-design-notes.md index 79ba5a54..1ec65bfb 100644 --- a/doc/omni-design-notes.md +++ b/doc/omni-design-notes.md @@ -342,7 +342,7 @@ has many helper functions for retrieving `GetVersion` values, using the cache if calling GetVersion, and caching the result (including any error return). Note that Omni calls GetVersion twice when the user invokes GetVersion explicitly. ### `self.clients` -A list of XMLRPC client objects, one per aggregate that the call should be run at. The entries are corrected to point to the right URL by `self._correctAPIVersion`. The veriable is filled in by self._getclients(). That method first calls `handler_utils._listaggregates` +A list of XMLRPC client objects, one per aggregate that the call should be run at. The entries are corrected to point to the right URL by `self._correctAPIVersion`. The variable is filled in by `self._getclients()`. That method first calls `handler_utils._listaggregates` to get the right list of aggregates. Then an XMLRPC client is created for each. The client object is marked up with a nickname (using `handler_utils._lookupAggNick`) and a pretty string for printing out the contact. `self._getclients()` is called by each method. From f8ea0a39983d3b6449a27e5fa41cceb28f4a67c5 Mon Sep 17 00:00:00 2001 From: Aaron Helsinger Date: Fri, 11 Dec 2015 12:11:52 -0500 Subject: [PATCH 20/27] fix typo --- doc/omni-design-notes.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/omni-design-notes.md b/doc/omni-design-notes.md index 1ec65bfb..a7dcba06 100644 --- a/doc/omni-design-notes.md +++ b/doc/omni-design-notes.md @@ -359,7 +359,7 @@ Omni users will often invoke Omni with a generic nickname (`gpo-ig`) or URL, dis invoking. They may also easily forget to supply the `-V3` argument when that was intended. This function attempts to correct for these mistakes. This function first ensures that all clients are reachable, dropping those that are not. Then it figures out which AM API version most AMs talk. It then auto corrects which version of the AM API -it uses. Later, Omni will change individual clients to use a different URL to match the desired AM API version as needed (see `_checkValidClient and how it is called from `_api_call`). +it uses. Later, Omni will change individual clients to use a different URL to match the desired AM API version as needed (see `_checkValidClient` and how it is called from `_api_call`). ### `self._api_call` This function wraps calls to the XMLRPC AM clients. First it ensures that the client exists and speaks the correct AM API version (raising a `BadClientException` if not). Then it makes the call (wrapped in `_do_ssl`). From fca8bcd8c169a0e3182dd414ff6edbddee2cae49 Mon Sep 17 00:00:00 2001 From: Aaron Helsinger Date: Fri, 11 Dec 2015 13:05:29 -0500 Subject: [PATCH 21/27] sync up issues with github --- CHANGES | 18 ++++++++++-------- README-omni.txt | 4 ++-- 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/CHANGES b/CHANGES index 1daf869c..a5cd1bb8 100644 --- a/CHANGES +++ b/CHANGES @@ -4,6 +4,10 @@ gcf 2.10: * Changed references to trac.gpolab.bbn.com to point to Github. Although those pages mostly still reference trac, that is the future home. These changes include changing where the `agg_nick_cache` lives. (#814) + * Add some omni design notes (work in progress). (#883) + * Document how to create a release. (#871) + * Add Debian and RPM packaging configuration (#849) + * Update CentOS installation instructions (#853) * Omni * Continue anyway if no aggregate nickname cache can be loaded. (#822) @@ -21,8 +25,8 @@ gcf 2.10: * Thanks to Umar Toseef for the bug report. * Calling `getslicecred` while specifying a `slicecredfile` that exists no longer means just return that file. Instead, that file will be - ignored and, if you specify `-o`, replaced. (#868) - * Moved canonical `agg_nick_cache` location to Github. (#814) + ignored and, if you specify `-o`, replaced. (#868, #869) + * Moved canonical `agg_nick_cache` location to Github. (#814, #882) * Use `urllib2.urlopen` instead of `urllib.urlretrieve` to avoid bad interaction with M2Crypto. (#881) @@ -30,7 +34,7 @@ gcf 2.10: * Catch expiration too great errors from PG AMs and quit. (#828) * Bug fix combining manifests involving a fixed endpoint. (#833) * Fix up combining manifests using ExoGENI, to ensure the stitching - hops list the actual reserved VLAN tags. (#873) + hops list the actual reserved VLAN tags. (#873, #876) * Support detecting OESS AM using `geni_am_type`. (#835) * Do not insist on 2 reciprocal properties on links, allowing more flexibility perhaps. (#838) @@ -47,7 +51,7 @@ gcf 2.10: * Thanks to Hussam Nasir * omni-configure - * Modify omni-configure to support multi-user systems (#843) + * Modify omni-configure to support multi-user systems (#843, #877) * gcf * Add new parameters to decode_urns so that derived delegates can @@ -76,11 +80,9 @@ gcf 2.10: a proper return value indicating an error occured. (#841) * Log the HTTP request line when `--debug`. (#842) * Fix some typos in `Provision()` in `am3.py`. (#846) - * Add Debian and RPM packaging configuration (#849) - * Fix am2 not keeping resources' state updated when creating or deleting Slivers (#848) + * Fix am2 not keeping resources' state updated when creating or deleting Slivers (#848, #850) * Update generated certificate key size and signature algorithm to more - modern values (#851) - * Update CentOS installation instructions (#853) + modern values (#851, #852) * Point people to gcf-developers@googlegroups.com instead of old list. * In AM3, fix exception on expire_slivers. Aggregate stores resources, not slivers. (#863) diff --git a/README-omni.txt b/README-omni.txt index b6e40535..3f5fa35c 100644 --- a/README-omni.txt +++ b/README-omni.txt @@ -57,8 +57,8 @@ New in v2.10: * Thanks to Umar Toseef for the bug report. * Calling `getslicecred` while specifying a `slicecredfile` that exists no longer means just return that file. Instead, that file will be - ignored and, if you specify `-o`, replaced. (#868) - * Moved canonical `agg_nick_cache` location to Github. (#814) + ignored and, if you specify `-o`, replaced. (#868, #869) + * Moved canonical `agg_nick_cache` location to Github. (#814, #882) * Use `urllib2.urlopen` instead of `urllib.urlretrieve` to avoid bad interaction with M2Crypto. (#881) From 8913f9e18775dbde1b6d237d7c1295395a75d3b2 Mon Sep 17 00:00:00 2001 From: Aaron Helsinger Date: Tue, 15 Dec 2015 10:02:10 -0500 Subject: [PATCH 22/27] next version is 2.11 --- CHANGES | 2 ++ INSTALL.txt | 8 ++++---- README-omni.txt | 4 +++- README-packaging.md | 16 ++++++++-------- configure.ac | 2 +- mac_install/INSTALL.txt | 6 +++--- mac_install/addAliases.command | 16 ++++++++-------- mac_install/makeMacdmg.sh | 2 +- src/gcf/gcf_version.py | 2 +- windows_install/package_builder.iss | 14 +++++++------- 10 files changed, 38 insertions(+), 34 deletions(-) diff --git a/CHANGES b/CHANGES index a5cd1bb8..493bbe3b 100644 --- a/CHANGES +++ b/CHANGES @@ -1,5 +1,7 @@ # Note: keep this file in wiki format for easy pasting to the gcf wiki +gcf 2.11: + gcf 2.10: * Changed references to trac.gpolab.bbn.com to point to Github. Although those pages mostly still reference trac, that is the future home. diff --git a/INSTALL.txt b/INSTALL.txt index 14974643..c9b19a9a 100644 --- a/INSTALL.txt +++ b/INSTALL.txt @@ -22,22 +22,22 @@ Section that is different is Section 3 * If you have downloaded the software from the git repository, you can skip this step. {{{ - tar xvfz gcf-2.10.tar.gz + tar xvfz gcf-2.11.tar.gz }}} * Move the gcf directory to the directory where you want to permanently keep gcf. This might be your home directory. [[BR]]If you have `sudo` privileges in your host, you might want to consider moving the gcf package under `/usr/local/bin/` for a cleaner setup. {{{ - [sudo] mv gcf-2.10 + [sudo] mv gcf-2.11 }}} * Create a symbolic link called `gcf` to your installation directory. This will make the process of upgrading omni easier. - If this is your first time installing gcf, do: {{{ cd - rm gcf; ln -s gcf-2.10 gcf + rm gcf; ln -s gcf-2.11 gcf }}} - If you are upgrading your gcf, do: {{{ cd - ln -s gcf-2.10 gcf + ln -s gcf-2.11 gcf }}} == 2. Add GCF to your path == diff --git a/README-omni.txt b/README-omni.txt index 3f5fa35c..c3f48787 100644 --- a/README-omni.txt +++ b/README-omni.txt @@ -41,6 +41,8 @@ tips, see the Omni Wiki: https://github.com/GENI-NSF/geni-tools/wiki/Omni == Release Notes == +New in v2.11: + New in v2.10: * Continue anyway if no aggregate nickname cache can be loaded. (#822) * Sliver info reporting and operations on AMs by nickname will likely fail. @@ -642,7 +644,7 @@ Omni supports the following command-line options. {{{ $ ~/gcf/src/omni.py -h Usage: -GENI Omni Command Line Aggregate Manager Tool Version 2.10 +GENI Omni Command Line Aggregate Manager Tool Version 2.11 Copyright (c) 2011-2015 Raytheon BBN Technologies omni.py [options] [--project ] diff --git a/README-packaging.md b/README-packaging.md index d0730f54..fc5431a9 100644 --- a/README-packaging.md +++ b/README-packaging.md @@ -21,7 +21,7 @@ after unpacking the tar file. Once the tar file has been downloaded, follow these steps to build the package: ``` -VERSION=2.10 +VERSION=2.11 mv geni-tools-${VERSION}.tar.gz geni-tools_${VERSION}.orig.tar.gz tar zxf geni-tools_${VERSION}.orig.tar.gz cd geni-tools-${VERSION} @@ -44,7 +44,7 @@ handling. The extra step is only necessary when installing the debian package manually. ``` -dpkg -i geni-tools_2.10-1_all.deb +dpkg -i geni-tools_2.11-1_all.deb apt-get -f install ``` @@ -73,7 +73,7 @@ Once the tar file has been downloaded, follow these steps to build the package: ``` -VERSION=2.10 +VERSION=2.11 tar zxf geni-tools-${VERSION}.tar.gz mv geni-tools-${VERSION}.tar.gz "${HOME}"/rpmbuild/SOURCES mv geni-tools-${VERSION}/geni-tools.spec "${HOME}"/rpmbuild/SPECS @@ -82,8 +82,8 @@ rpmbuild -ba geni-tools.spec ``` This will generate the following files: - * The rpm: `"${HOME}"/rpmbuild/RPMS/noarch/geni-tools-2.10-1.el6.noarch.rpm` - * The source rpm: `"${HOME}"/rpmbuild/SRPMS/geni-tools-2.10-1.el6.src.rpm` + * The rpm: `"${HOME}"/rpmbuild/RPMS/noarch/geni-tools-2.11-1.el6.noarch.rpm` + * The source rpm: `"${HOME}"/rpmbuild/SRPMS/geni-tools-2.11-1.el6.src.rpm` # Creating a yum repository @@ -98,9 +98,9 @@ Create a repository directory and move the files into it: ``` mkdir repo cd repo -mv "${HOME}"/rpmbuild/RPMS/noarch/geni-tools-2.10-1.el6.noarch.rpm . -mv "${HOME}"/rpmbuild/SRPMS/geni-tools-2.10-1.el6.src.rpm . -mv "${HOME}"/rpmbuild/SOURCES/geni-tools-2.10.tar.gz . +mv "${HOME}"/rpmbuild/RPMS/noarch/geni-tools-2.11-1.el6.noarch.rpm . +mv "${HOME}"/rpmbuild/SRPMS/geni-tools-2.11-1.el6.src.rpm . +mv "${HOME}"/rpmbuild/SOURCES/geni-tools-2.11.tar.gz . mv "${HOME}"/rpmbuild/SPECS/geni-tools.spec . ``` diff --git a/configure.ac b/configure.ac index f3250001..aac85ab2 100644 --- a/configure.ac +++ b/configure.ac @@ -1,4 +1,4 @@ -AC_INIT([geni-tools], [2.10], [help@geni.net]) +AC_INIT([geni-tools], [2.11], [help@geni.net]) AM_INIT_AUTOMAKE([foreign -Wall]) AC_PROG_MKDIR_P AC_PROG_INSTALL diff --git a/mac_install/INSTALL.txt b/mac_install/INSTALL.txt index 95c27a1e..b95c357f 100644 --- a/mac_install/INSTALL.txt +++ b/mac_install/INSTALL.txt @@ -1,9 +1,9 @@ INSTALLING OMNI TOOLS --------------------- -1. Drag the omniTools-2.10 icon to the Applications icon. +1. Drag the omniTools-2.11 icon to the Applications icon. 2. Open a terminal window. -3. Run the script /Applications/omniTools-2.10/addAliases.command. This script will add aliases for the various +3. Run the script /Applications/omniTools-2.11/addAliases.command. This script will add aliases for the various Omni Tools in your ~/.bash_profile or ~/.bash_login or ~/.profile. (The script looks for these files in this order). @@ -23,4 +23,4 @@ UNINSTALLING OMNI TOOLS READMEs and associated documentation are installed in -/Applications/omniTools-2.10, or available online: https://github.com/GENI-NSF/geni-tools/wiki +/Applications/omniTools-2.11, or available online: https://github.com/GENI-NSF/geni-tools/wiki diff --git a/mac_install/addAliases.command b/mac_install/addAliases.command index c77cd6f4..a554769e 100755 --- a/mac_install/addAliases.command +++ b/mac_install/addAliases.command @@ -35,14 +35,14 @@ writeAliases () { if [ "$lastline" != "" ]; then echo $'\n' >> $1 fi - echo "# Aliases for commands in the GENI omniTools-2.10 package" >> $1 - echo "alias omni='/Applications/omniTools-2.10/omni.app/Contents/MacOS/omni'" >> $1 - echo "alias stitcher='/Applications/omniTools-2.10/stitcher.app/Contents/MacOS/stitcher'" >> $1 - echo "alias omni-configure='/Applications/omniTools-2.10/omni-configure.app/Contents/MacOS/omni-configure'" >> $1 - echo "alias readyToLogin='/Applications/omniTools-2.10/readyToLogin.app/Contents/MacOS/readyToLogin'" >> $1 - echo "alias addMemberToSliceAndSlivers='/Applications/omniTools-2.10/addMemberToSliceAndSlivers.app/Contents/MacOS/addMemberToSliceAndSlivers'" >> $1 - echo "alias clear-passphrases='/Applications/omniTools-2.10/clear-passphrases.app/Contents/MacOS/clear-passphrases'" >> $1 - echo "alias remote-execute='/Applications/omniTools-2.10/remote-execute.app/Contents/MacOS/remote-execute'" >> $1 + echo "# Aliases for commands in the GENI omniTools-2.11 package" >> $1 + echo "alias omni='/Applications/omniTools-2.11/omni.app/Contents/MacOS/omni'" >> $1 + echo "alias stitcher='/Applications/omniTools-2.11/stitcher.app/Contents/MacOS/stitcher'" >> $1 + echo "alias omni-configure='/Applications/omniTools-2.11/omni-configure.app/Contents/MacOS/omni-configure'" >> $1 + echo "alias readyToLogin='/Applications/omniTools-2.11/readyToLogin.app/Contents/MacOS/readyToLogin'" >> $1 + echo "alias addMemberToSliceAndSlivers='/Applications/omniTools-2.11/addMemberToSliceAndSlivers.app/Contents/MacOS/addMemberToSliceAndSlivers'" >> $1 + echo "alias clear-passphrases='/Applications/omniTools-2.11/clear-passphrases.app/Contents/MacOS/clear-passphrases'" >> $1 + echo "alias remote-execute='/Applications/omniTools-2.11/remote-execute.app/Contents/MacOS/remote-execute'" >> $1 } # Function that removes lines that look like what writeAliases adds diff --git a/mac_install/makeMacdmg.sh b/mac_install/makeMacdmg.sh index e7ca6dd8..1bb36ddd 100644 --- a/mac_install/makeMacdmg.sh +++ b/mac_install/makeMacdmg.sh @@ -1,7 +1,7 @@ # Script to build the .dmg file on a Mac. SRCDIR=~/gcf COVERDIR=~/omniTools -DESTDIR=${COVERDIR}/omniTools-2.10 +DESTDIR=${COVERDIR}/omniTools-2.11 # Clear out any previous build rm -rf $DESTDIR/* diff --git a/src/gcf/gcf_version.py b/src/gcf/gcf_version.py index 25fb96f9..51b7c8dd 100644 --- a/src/gcf/gcf_version.py +++ b/src/gcf/gcf_version.py @@ -22,4 +22,4 @@ #---------------------------------------------------------------------- # The current version of GCF and Omni. Update this with each new release -GCF_VERSION="2.10" +GCF_VERSION="2.11" diff --git a/windows_install/package_builder.iss b/windows_install/package_builder.iss index 22aba010..930f45ad 100644 --- a/windows_install/package_builder.iss +++ b/windows_install/package_builder.iss @@ -1,22 +1,22 @@ [Setup] OutputDir=C:\Users\local_user\gcf\executables -OutputBaseFilename=omniTools-2.10-win-setup +OutputBaseFilename=omniTools-2.11-win-setup AppCopyright=2010-2015 -AppName=omniTools-2.10 -AppVerName=omniTools-2.10 +AppName=omniTools-2.11 +AppVerName=omniTools-2.11 InfoAfterFile=C:\Users\local_user\gcf\windows_install\infoAfterFile.rtf LicenseFile=C:\Users\local_user\gcf\windows_install\LICENSE.TXT -DefaultDirName={pf}\omniTools-2.10 -DefaultGroupName=omniTools-2.10 +DefaultDirName={pf}\omniTools-2.11 +DefaultGroupName=omniTools-2.11 ShowLanguageDialog=no UsePreviousAppDir=false [Run] Filename: {app}\install.vbs; Flags: shellexec [Icons] Name: {group}\Documentation; Filename: https://github.com/GENI-NSF/geni-tools/wiki; Comment: omni wiki -Name: {group}\How To Configure omniTools-2.10; Filename: https://github.com/GENI-NSF/geni-tools/wiki/Windows; Comment: Instructions for configuring omniTools-2.10 +Name: {group}\How To Configure omniTools-2.11; Filename: https://github.com/GENI-NSF/geni-tools/wiki/Windows; Comment: Instructions for configuring omniTools-2.11 Name: {group}\Disclaimer; Filename: {app}\LICENSE.TXT -Name: {group}\{cm:UninstallProgram, omniTools-2.10}; Filename: {uninstallexe} +Name: {group}\{cm:UninstallProgram, omniTools-2.11}; Filename: {uninstallexe} [Files] Source: LICENSE.TXT; DestDir: {app} Source: ..\README-omni.txt; DestDir: {app} From 869e086c863911b4e5673f70445f72295f7b77d9 Mon Sep 17 00:00:00 2001 From: Aaron Helsinger Date: Tue, 15 Dec 2015 16:28:07 -0500 Subject: [PATCH 23/27] typos, minor cleanup --- doc/omni-design-notes.md | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/doc/omni-design-notes.md b/doc/omni-design-notes.md index a7dcba06..d1205df7 100644 --- a/doc/omni-design-notes.md +++ b/doc/omni-design-notes.md @@ -710,6 +710,8 @@ There are multiple support script included with geni-tools under `src` and `exam ## readyToLogin Use `sliverstatus` and the manifest to determine when compute resources are ready for use, and report the proper SSH commandline. See github for open issues. +This script takes into account the differences between various AM types, making it more complex than you might imagine. + ## omni-configure Run this on the Omni configuration bundle downloaded from the GENI portal to set up SSH and SSL keys and the omni.config file needed to run Omni. @@ -719,8 +721,10 @@ Remove the passphrase from an SSL key ## deleteSliceCred Slice credentials can be delegated. A delegated slice credential may be a subset of the permissions in theory, though in practice all credentials allow doing anything. When using a delegated credential, the actor appears to be the owner of the resources and is responsible, as opposed to speaks for, where the original user retains responsibility. This script allows generating a delegated slice credential. +The script is a little hard to use (lots of arguments). But this may just be a documentation problem. + ## addMemberToSliceAndSlivers -Update slice membership at the CH (not supported by all CHs) and then use the slice membership to install SSH keys (as listed by the CH) on the slivers, using the `poa` command. Note supported at all aggregates. +Update slice membership at the CH (not supported by all CHs) and then use the slice membership to install SSH keys (as listed by the CH) on the slivers, using the `poa` command. Not supported at all aggregates. ## experiationofmyslices Essentially `print_sliver_expiration` on all slices listed at the CH @@ -738,7 +742,7 @@ Note that there are limits to the AM API support of this GCF AM, such as some of You can do basic tests that the GCF AM/CH are working using `gcf-test`. Omni can talk to the GCF CH, and of course to the AM as it is just another aggregate; use `type=gcf` in your `omni_config`. -`gen-certs.py` can be used to generate some testing certificates for the GCF CH and AM, and a test user or 2. +`gen-certs.py` can be used to generate some testing certificates for the GCF CH and AM, and a test user or 2. This script should really be rewritten to use raw openssl, allowing us to get certificates with varying serial numbers, for example. The GCF code sits under `src/gcf/geni`. From 18697ac6af6a80f903e1bf2818b23eb1befb7ccb Mon Sep 17 00:00:00 2001 From: Aaron Helsinger Date: Tue, 15 Dec 2015 16:40:18 -0500 Subject: [PATCH 24/27] formatting cleanup, formatting typos, all smoothing the diffs with later conversion to .md format --- README-omni.txt | 78 ++++++++++++++++++++++++------------------------- 1 file changed, 39 insertions(+), 39 deletions(-) diff --git a/README-omni.txt b/README-omni.txt index c3f48787..2f8702b8 100644 --- a/README-omni.txt +++ b/README-omni.txt @@ -30,7 +30,8 @@ multi-aggregate topologies, see README-stitching.txt. The currently supported CFs (clearinghouses) are the GENI Portal, ProtoGENI, SFA (!PlanetLab), and GCF. Omni works with any GENI AM API compliant AM. -These include InstaGENI and ExoGENI racks, ProtoGENI, !OpenFlow, SFA, AL2S, FOAM and GCF. +These include InstaGENI and ExoGENI racks, ProtoGENI, !OpenFlow, SFA, +AL2S, FOAM, GRAM, !CloudLab and GCF. Omni performs the following functions: * Talks to each CF in its native API @@ -391,7 +392,7 @@ sa=https://ch.geni.net/SA Windows and Mac binaries. (#542) - Fix wording and licenses for Windows and Mac binaries (#541) - +Stitcher and other tool changes are listed in the CHANGES file. Older changes are listed in the CHANGES file. == Handling Omni Output == @@ -1078,7 +1079,7 @@ Sample Usage: }}} Slice name could be a full URN, but is usually just the slice name portion. -Note that PLC Web UI lists slices as _ +Note that PLC Web UI lists slices as `_` (e.g. bbn_myslice), and we want only the slice name part here (e.g. myslice). Note that Slice Authorities typically limit this call to @@ -1117,7 +1118,7 @@ and replaced if you specify `-o`. Arg: slice name Slice name could be a full URN, but is usually just the slice name portion. -Note that PLC Web UI lists slices as _ +Note that PLC Web UI lists slices as `_` (e.g. bbn_myslice), and we want only the slice name part here (e.g. myslice). ==== renewslice ==== @@ -1130,7 +1131,7 @@ Format: `omni.py renewslice ` Sample Usage: `omni.py renewslice myslice 20100928T15:00:00Z` Slice name could be a full URN, but is usually just the slice name portion. -Note that PLC Web UI lists slices as _ +Note that PLC Web UI lists slices as `_` (e.g. bbn_myslice), and we want only the slice name part here (e.g. myslice). The date-time argument takes a standard form such as "MM/DD/YYYY @@ -1150,7 +1151,7 @@ Format: `omni.py deleteslice ` Sample Usage: `omni.py deleteslice myslice` Slice name could be a full URN, but is usually just the slice name portion. -Note that PLC Web UI lists slices as _ +Note that PLC Web UI lists slices as `_` (e.g. bbn_myslice), and we want only the slice name part here (e.g. myslice). Delete all your slivers first! Deleting your slice does not free up resources at @@ -1296,7 +1297,7 @@ Sample Usage: `omni.py print_slice_expiration my_slice` Arg: slice name Slice name could be a full URN, but is usually just the slice name portion. -Note that PLC Web UI lists slices as _ +Note that PLC Web UI lists slices as `_` (e.g. bbn_myslice), and we want only the slice name part here (e.g. myslice). With the `--slicecredfile` option the slice's credential is read from @@ -1487,7 +1488,7 @@ Aggregates queried: Output options: - `-o`: Save result (JSON format) in per-aggregate files - - `-p `: Prefix for resulting version information files (used with -o) + - `-p `: Prefix for resulting version information files (used with `-o`) - `--outputfile `: If supplied, use this output file name: substitute the AM for any %a - If not saving results to a file, they are logged. - If use `--tostdout` option, then instead of logging, print to STDOUT. @@ -1495,7 +1496,7 @@ Output options: Omni caches getversion results for use elsewhere. This method skips the local cache. - `--ForceUseGetVersionCache` will force it to look at the cache if possible - `--GetVersionCacheAge <#>` specifies the # of days old a cache entry can be, before Omni re-queries the AM, default is 7 - - `--GetVersionCacheName ` is the path to the !GetVersion cache, default is ~/.gcf/get_version_cache.json + - `--GetVersionCacheName ` is the path to the !GetVersion cache, default is `~/.gcf/get_version_cache.json` Options: - `--api-version #` or `-V #` or `-V#`: AM API Version # (default: 2) @@ -1570,7 +1571,7 @@ Aggregates queried: Output options: - `-o`: Save result in per-aggregate files - - `-p `: Prefix for resulting rspec files (used with -o) + - `-p `: Prefix for resulting rspec files (used with `-o`) - `--outputfile `: If supplied, use this output file name: substitute the AM for any %a, the slice name for any %s. - If not saving results to a file, they are logged. @@ -1726,7 +1727,7 @@ omni will try to read 'myrspec' by interpreting it in the following order: 2. an RSpec nickname specified in the omni_config 3. a file in a location (file or url) defined as: `/.` -where and are defined in the omni_config. +where `` and `` are defined in the omni_config. For help creating GENI RSpecs, see http://www.protogeni.net/trac/protogeni/wiki/RSpec. @@ -1746,7 +1747,7 @@ named something like: `myPrefix-mySlice-manifest-rspec-AggregateServerName.xml` Slice name could be a full URN, but is usually just the slice name portion. -Note that PLC Web UI lists slices as _ +Note that PLC Web UI lists slices as `_` (e.g. bbn_myslice), and we want only the slice name part here (e.g. myslice). Options: @@ -1775,7 +1776,7 @@ section. Thus any member of your slice _plus_ anyone using the specific SSH keys you specify will be able to log in via SSH into reserved compute resources. 2 command-line options control this: - - `--ignoreConfiguUsers': When supplied, ignore the omni_config + - `--ignoreConfiguUsers`: When supplied, ignore the omni_config `users` and do not install any keys listed there. - `--noSliceMembers`: When supplied, over-ride the default and do NOT contact the clearinghouse to retrieve slice members. @@ -1821,7 +1822,7 @@ Clients must `renew` or `provision` slivers before the expiration time (given in the struct returned from `allocate`), or the aggregate will automatically delete them. Slice name could be a full URN, but is usually just the slice name portion. -Note that the PLC Web UI lists slices as _ +Note that the PLC Web UI lists slices as `_` (e.g. bbn_myslice), and we want only the slice name part here (e.g. myslice). Slice credential is usually retrieved from the Slice Authority. But @@ -1905,7 +1906,7 @@ Clients must `renew` or use slivers before the expiration time (given in the return struct), or the aggregate will automatically delete them. Slice name could be a full URN, but is usually just the slice name portion. -Note that PLC Web UI lists slices as _ +Note that PLC Web UI lists slices as `_` (e.g. bbn_myslice), and we want only the slice name part here (e.g. myslice). The slice credential is usually retrieved from the Slice Authority. But @@ -2037,7 +2038,7 @@ Options: Slice name could be a full URN, but is usually just the slice name portion. -Note that PLC Web UI lists slices as _ +Note that PLC Web UI lists slices as `_` (e.g. bbn_myslice), and we want only the slice name part here (e.g. myslice). Aggregates queried: @@ -2100,7 +2101,7 @@ available to the slice (see `print_slice_expiration` and should be quoted if they contain spaces or forward slashes. Slice name could be a full URN, but is usually just the slice name portion. -Note that PLC Web UI lists slices as _ +Note that PLC Web UI lists slices as `_` (e.g. bbn_myslice), and we want only the slice name part here (e.g. myslice). Slice credential is usually retrieved from the Slice Authority. But @@ -2137,8 +2138,7 @@ offset-naive and offset-aware date times"` you should add the "--no-tz" flag to the omni renewsliver command line. ==== renew ==== -AM API Renew +AM API Renew (Args: ` `) For use with AM API v3+. For AM API v1 & v2, see `renewsliver`. Sample usage: @@ -2164,7 +2164,7 @@ available to the slice (see `print_slice_expiration` and should be quoted if they contain spaces or forward slashes. Slice name could be a full URN, but is usually just the slice name portion. -Note that PLC Web UI lists slices as _ +Note that PLC Web UI lists slices as `_` (e.g. bbn_myslice), and we want only the slice name part here (e.g. myslice). Slice credential is usually retrieved from the Slice Authority. But @@ -2192,7 +2192,7 @@ whole operation fails. To request that your reservation be extended as long as possible, supply the `--alap` option. Default is `False`. This option is not supported at all aggregates. - - `--sliver-urn ` / -u option: each specifies a sliver URN to renew. If specified, + - `--sliver-urn ` / `-u` option: each specifies a sliver URN to renew. If specified, only the listed slivers will be renewed. Otherwise, all slivers in the slice will be renewed. - `--best-effort`: If supplied, slivers that can be renewed, will be; some slivers may not be renewed, in which case check the `geni_error` return for that sliver. @@ -2209,11 +2209,11 @@ time, per the `geni_single_allocation` field returned by `getversion`. Output directing options: - `-o`: Save result in per-aggregate files - - `-p ` (used with -o): Prefix for resulting files + - `-p ` (used with `-o`): Prefix for resulting files - `--outputfile `: If supplied, use this output file name: substitute the AM for any `%a`, and slicename for any `%s` - If not saving results to a file, they are logged. - If `--tostdout` option, then instead of logging, print to STDOUT. - - When using `-o and not `--outputfile`, file names will indicate the + - When using `-o` and not `--outputfile`, file names will indicate the slice name, file format, and which aggregate is represented. e.g.: `myprefix-myslice-renew-localhost-8001.json` @@ -2228,7 +2228,7 @@ Options for development and testing: ==== sliverstatus ==== GENI AM API !SliverStatus function -Format: omni.py [-a AM_URL_or_nickname] sliverstatus ` +Format: `omni.py [-a AM_URL_or_nickname] sliverstatus ` Sample Usage: * Run `sliverstatus` on all slivers in slice, myslice, at all aggregates @@ -2245,7 +2245,7 @@ status of the specified slice. This can include expiration time, whether the resource is ready for use, and the SFA node login name. Slice name could be a full URN, but is usually just the slice name portion. -Note that PLC Web UI lists slices as _ +Note that PLC Web UI lists slices as `_` (e.g. bbn_myslice), and we want only the slice name part here (e.g. myslice). Slice credential is usually retrieved from the Slice Authority. But @@ -2263,12 +2263,12 @@ Aggregates queried: Options: - `--api-version #` or `-V #` or `-V#`: AM API Version # (default: 2) - `-o` Save result in per-aggregate files - - `-p ` Prefix for resulting files (used with -o) + - `-p ` Prefix for resulting files (used with `-o`) - If not saving results to a file, they are logged. - If `--tostdout` option, then instead of logging, print to STDOUT. ==== status ==== -AM API Status . For use in AM API v3+. +AM API Status (slice name). For use in AM API v3+. See `sliverstatus` for the AM API v1 and v2 equivalent. @@ -2283,7 +2283,7 @@ Sample usage: }}} Slice name could be a full URN, but is usually just the slice name portion. -Note that PLC Web UI lists slices as _ +Note that PLC Web UI lists slices as `_` (e.g. bbn_myslice), and we want only the slice name part here (e.g. myslice). Slice credential is usually retrieved from the Slice Authority. But @@ -2339,7 +2339,7 @@ Sample Usage: `omni.py -a myLocalAM deletesliver myslice` Slice name could be a full URN, but is usually just the slice name portion. -Note that PLC Web UI lists slices as _ +Note that PLC Web UI lists slices as `_` (e.g. bbn_myslice), and we want only the slice name part here (e.g. myslice). Slice credential is usually retrieved from the Slice Authority. But @@ -2352,7 +2352,7 @@ Aggregates acted on: - List of URNs and URLs provided by the selected clearinghouse ==== delete ==== -AM API Delete . For use in AM API v3+. +AM API Delete (slicename). For use in AM API v3+. For AM API v1 and v2, see `deletesliver`. Delete the named slivers, making them `geni_unallocated`. Resources are stopped @@ -2373,7 +2373,7 @@ Sample usage: }}} Slice name could be a full URN, but is usually just the slice name portion. -Note that PLC Web UI lists slices as _ +Note that PLC Web UI lists slices as `_` (e.g. bbn_myslice), and we want only the slice name part here (e.g. myslice). Slice credential is usually retrieved from the Slice Authority. But @@ -2434,7 +2434,7 @@ Sample Usage: `omni.py -a myLocalAM shutdown myslice` Slice name could be a full URN, but is usually just the slice name portion. -Note that PLC Web UI lists slices as _ +Note that PLC Web UI lists slices as `_` (e.g. bbn_myslice), and we want only the slice name part here (e.g. myslice). Slice credential is usually retrieved from the Slice Authority. But @@ -2450,7 +2450,7 @@ Aggregates queried: - List of URNs and URLs provided by the selected clearinghouse ==== update ==== -Call GENI AM API Update +Call GENI AM API Update (Args: ` `) For use with AM API v3+ only, and only at some AMs. Technically adopted for AM API v4, but may be implemented by v3 AMs. @@ -2483,7 +2483,7 @@ but only after calling `Provision`. Slivers that were `geni_allocated` or `geni_updating` are immediately changed. Slice name could be a full URN, but is usually just the slice name portion. -Note that PLC Web UI lists slices as _ +Note that PLC Web UI lists slices as `_` (e.g. bbn_myslice), and we want only the slice name part here (e.g. myslice). Slice credential is usually retrieved from the Slice Authority. But @@ -2537,7 +2537,7 @@ Options for development and testing: - `--devmode`: Continue on error if possible ==== cancel ==== -Call GENI AM API Cancel +Call GENI AM API Cancel (slice name) For use with AM API v3+ only, and only at some AMs. Technically adopted for AM API v4, but may be implemented by v3 AMs. @@ -2562,7 +2562,7 @@ Sample usage: `omni.py -V3 -a http://myaggregate/url -a http://myother/aggregate -o --outputfile myslice-manifest-%a.json --slicecredfile mysaved-myslice-slicecred.xml cancel myslice` Slice name could be a full URN, but is usually just the slice name portion. -Note that PLC Web UI lists slices as _ +Note that PLC Web UI lists slices as `_` (e.g. bbn_myslice), and we want only the slice name part here (e.g. myslice). Slice credential is usually retrieved from the Slice Authority. But @@ -2614,7 +2614,7 @@ ProtoGENI AMs. See http://www.protogeni.net/trac/protogeni/wiki/ImageHowTo -Format: omni.py createimage SLICENAME IMAGENAME [false] -u +Format: `omni.py createimage SLICENAME IMAGENAME [false] -u ` By default, images are public. To make the image private, supply the optional 3rd argument 'false'. @@ -2629,7 +2629,7 @@ later when it is done. In the interval, don't change anything. Note that if you re-use the image name, you replace earlier content. Slice name could be a full URN, but is usually just the slice name portion. -Note that PLC Web UI lists slices as _ +Note that PLC Web UI lists slices as `_` (e.g. bbn_myslice), and we want only the slice name part here (e.g. myslice). Slice credential is usually retrieved from the Slice Authority. But @@ -2757,7 +2757,7 @@ Resources in slice ahtest at AM utahddc-ig expire at 2014-05-21T00:00:00 UTC. }}} Slice name could be a full URN, but is usually just the slice name portion. -Note that PLC Web UI lists slices as _ +Note that PLC Web UI lists slices as `_` (e.g. bbn_myslice), and we want only the slice name part here (e.g. myslice). Slice credential is usually retrieved from the Slice Authority. But From fe30d04a24ae69d757c6db24fd700ea536f6fd18 Mon Sep 17 00:00:00 2001 From: Aaron Helsinger Date: Wed, 16 Dec 2015 12:17:09 -0500 Subject: [PATCH 25/27] update cache to list latest release and release date --- agg_nick_cache.base | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/agg_nick_cache.base b/agg_nick_cache.base index 8bb2d94b..df99e67b 100644 --- a/agg_nick_cache.base +++ b/agg_nick_cache.base @@ -1,7 +1,7 @@ ### DO NOT MODIFY THIS FILE BY HAND ### # This file lives at: https://raw.githubusercontent.com/GENI-NSF/geni-tools/master/agg_nick_cache.base # - the master branch of the geni-tools Github repository -# Last updated on December 9, 2015 +# Last updated on December 16, 2015 [omni_defaults] # This section is for updating Omni defaults without updating Omni. @@ -27,7 +27,7 @@ scs_url=https://geni-scs.net.internet2.edu:8443/geni/xmlrpc # Specify the latest version of Omni released, and a message # Expected format is "#,Message" EG: "2.8,Omni 2.8 was release 2/1/2015". No commas in the message. # If a newer version is available, Omni will log a message at INFO level. -latest_omni_version=2.9,Omni 2.9 was released 5/27/2015. See https://github.com/GENI-NSF/geni-tools/wiki +latest_omni_version=2.10,Omni 2.10 was released 12/16/2015. See https://github.com/GENI-NSF/geni-tools/wiki #------AM nicknames # Format : From 3c79603416fce0602221e50ac270d03028971812 Mon Sep 17 00:00:00 2001 From: Tom Mitchell Date: Thu, 17 Dec 2015 08:55:33 -0500 Subject: [PATCH 26/27] Remove bogus check for 'rspec' tag The check for an rspec tag is bogus because it does not take XML namespaces into account. It can cause erroneous errors on valid rspecs. Remove the check until a proper check can be put in place. --- CHANGES | 1 + src/gcf/geni/util/rspec_util.py | 13 +++++-------- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/CHANGES b/CHANGES index 493bbe3b..229b114c 100644 --- a/CHANGES +++ b/CHANGES @@ -1,6 +1,7 @@ # Note: keep this file in wiki format for easy pasting to the gcf wiki gcf 2.11: + * Remove bogus check for rspec tag (#885) gcf 2.10: * Changed references to trac.gpolab.bbn.com to point to Github. diff --git a/src/gcf/geni/util/rspec_util.py b/src/gcf/geni/util/rspec_util.py index 08a49df9..6810ca6b 100755 --- a/src/gcf/geni/util/rspec_util.py +++ b/src/gcf/geni/util/rspec_util.py @@ -329,14 +329,11 @@ def is_rspec_string( rspec, rspec_namespace=None, rspec_schema=None, if not is_wellformed_xml( rspec, logger ): return False - # (2) Check if rspec is a valid XML document - # (a) a snippet of XML starting with , or - # (b) a snippet of XML starting with - if (' Date: Wed, 13 Jan 2016 13:45:57 -0500 Subject: [PATCH 27/27] Update copyrights for 2016 --- LICENSE.txt | 2 +- README-omni.txt | 2 +- acceptance_tests/AM_API/am_api_accept.py | 2 +- acceptance_tests/AM_API/am_api_accept_delegate.py | 2 +- acceptance_tests/AM_API/am_api_accept_nagios.py | 2 +- acceptance_tests/AM_API/am_api_accept_scaling.py | 2 +- acceptance_tests/AM_API/am_api_accept_shutdown.py | 2 +- debian/copyright | 2 +- examples/addMemberToSliceAndSlivers.py | 2 +- examples/expirationofmyslices.py | 2 +- examples/myscript.py | 2 +- examples/readyToLogin.py | 2 +- examples/remote-execute.py | 2 +- examples/renewSliceAndSlivers.py | 2 +- mac_install/addAliases.command | 2 +- src/clear-passphrases.py | 2 +- src/delegateSliceCred.py | 2 +- src/gcf-am-gib.py | 2 +- src/gcf-am.py | 2 +- src/gcf-ch.py | 2 +- src/gcf-gch-gib.py | 2 +- src/gcf-gch.py | 2 +- src/gcf-pgch.py | 2 +- src/gcf-proxy-test.py | 2 +- src/gcf-proxy.py | 2 +- src/gcf-test.py | 2 +- src/gcf/gcf_version.py | 2 +- src/gcf/geni/SecureThreadedXMLRPCServer.py | 2 +- src/gcf/geni/SecureXMLRPCServer.py | 2 +- src/gcf/geni/__init__.py | 2 +- src/gcf/geni/am/aggregate.py | 2 +- src/gcf/geni/am/am2.py | 2 +- src/gcf/geni/am/am3.py | 2 +- src/gcf/geni/am/am_method_context.py | 2 +- src/gcf/geni/am/api_error_exception.py | 2 +- src/gcf/geni/am/fakevm.py | 2 +- src/gcf/geni/am/gibaggregate/am_gib.py | 2 +- src/gcf/geni/am/gibaggregate/config.py | 2 +- src/gcf/geni/am/gibaggregate/gib_manager.py | 2 +- src/gcf/geni/am/gibaggregate/graphUtils.py | 2 +- src/gcf/geni/am/gibaggregate/resources.py | 2 +- src/gcf/geni/am/gibaggregate/rspec_handler.py | 2 +- .../geni/am/gibaggregate/standardScripts/deleteSliver.sh | 2 +- src/gcf/geni/am/gibaggregate/standardScripts/hostSetup.sh | 2 +- src/gcf/geni/am/proxyam.py | 2 +- src/gcf/geni/am/resource.py | 2 +- src/gcf/geni/am1.py | 2 +- src/gcf/geni/auth/abac_authorizer.py | 2 +- src/gcf/geni/auth/abac_resource_manager.py | 2 +- src/gcf/geni/auth/argument_guard.py | 2 +- src/gcf/geni/auth/authorizer_client.py | 2 +- src/gcf/geni/auth/authorizer_server.py | 2 +- src/gcf/geni/auth/base_authorizer.py | 2 +- src/gcf/geni/auth/binders.py | 2 +- src/gcf/geni/auth/resource_binder.py | 2 +- src/gcf/geni/auth/sfa_authorizer.py | 2 +- src/gcf/geni/auth/util.py | 2 +- src/gcf/geni/ca.py | 2 +- src/gcf/geni/ch.py | 2 +- src/gcf/geni/config.py | 2 +- src/gcf/geni/gch.py | 2 +- src/gcf/geni/pgch.py | 2 +- src/gcf/geni/util/cert_util.py | 2 +- src/gcf/geni/util/ch_interface.py | 2 +- src/gcf/geni/util/cred_util.py | 2 +- src/gcf/geni/util/error_util.py | 2 +- src/gcf/geni/util/rspec_schema.py | 2 +- src/gcf/geni/util/rspec_util.py | 2 +- src/gcf/geni/util/secure_xmlrpc_client.py | 2 +- src/gcf/geni/util/speaksfor_util.py | 2 +- src/gcf/geni/util/tz_util.py | 2 +- src/gcf/geni/util/urn_util.py | 2 +- src/gcf/omnilib/amhandler.py | 2 +- src/gcf/omnilib/chhandler.py | 2 +- src/gcf/omnilib/frameworks/framework_apg.py | 2 +- src/gcf/omnilib/frameworks/framework_base.py | 2 +- src/gcf/omnilib/frameworks/framework_chapi.py | 2 +- src/gcf/omnilib/frameworks/framework_gcf.py | 2 +- src/gcf/omnilib/frameworks/framework_gch.py | 2 +- src/gcf/omnilib/frameworks/framework_gib.py | 2 +- src/gcf/omnilib/frameworks/framework_of.py | 2 +- src/gcf/omnilib/frameworks/framework_pg.py | 2 +- src/gcf/omnilib/frameworks/framework_pgch.py | 2 +- src/gcf/omnilib/frameworks/framework_sfa.py | 2 +- src/gcf/omnilib/handler.py | 2 +- src/gcf/omnilib/stitch/GENIObject.py | 2 +- src/gcf/omnilib/stitch/ManifestRSpecCombiner.py | 2 +- src/gcf/omnilib/stitch/RSpecParser.py | 2 +- src/gcf/omnilib/stitch/VLANRange.py | 2 +- src/gcf/omnilib/stitch/__init__.py | 2 +- src/gcf/omnilib/stitch/defs.py | 2 +- src/gcf/omnilib/stitch/launcher.py | 2 +- src/gcf/omnilib/stitch/objects.py | 2 +- src/gcf/omnilib/stitch/scs.py | 2 +- src/gcf/omnilib/stitch/utils.py | 2 +- src/gcf/omnilib/stitch/workflow.py | 2 +- src/gcf/omnilib/stitchhandler.py | 2 +- src/gcf/omnilib/util/__init__.py | 2 +- src/gcf/omnilib/util/credparsing.py | 2 +- src/gcf/omnilib/util/dates.py | 2 +- src/gcf/omnilib/util/dossl.py | 2 +- src/gcf/omnilib/util/faultPrinting.py | 2 +- src/gcf/omnilib/util/files.py | 2 +- src/gcf/omnilib/util/handler_utils.py | 2 +- src/gcf/omnilib/util/json_encoding.py | 2 +- src/gcf/omnilib/util/namespace.py | 2 +- src/gcf/omnilib/util/omnierror.py | 2 +- src/gcf/omnilib/util/paths.py | 2 +- src/gcf/omnilib/xmlrpc/client.py | 2 +- src/gcf/oscript.py | 4 ++-- src/gcf/sfa/trust/abac_credential.py | 2 +- src/gcf/sfa/trust/credential_factory.py | 2 +- src/gcf/stitcher_logging_deft.py | 2 +- src/gen-certs.py | 2 +- src/omni-configure.py | 2 +- src/omni.py | 2 +- src/omni_unittest.py | 2 +- src/stitcher.py | 4 ++-- windows_install/LICENSE.TXT | 2 +- windows_install/package_builder.iss | 6 +++--- windows_install/setup.py | 2 +- 121 files changed, 125 insertions(+), 125 deletions(-) diff --git a/LICENSE.txt b/LICENSE.txt index 4c89c7fb..4e47728f 100644 --- a/LICENSE.txt +++ b/LICENSE.txt @@ -1,4 +1,4 @@ -Copyright (c) 2010-2015 Raytheon BBN Technologies +Copyright (c) 2010-2016 Raytheon BBN Technologies Permission is hereby granted, free of charge, to any person obtaining a copy of this software and/or hardware specification (the "Work") to diff --git a/README-omni.txt b/README-omni.txt index 2f8702b8..fb689231 100644 --- a/README-omni.txt +++ b/README-omni.txt @@ -646,7 +646,7 @@ Omni supports the following command-line options. $ ~/gcf/src/omni.py -h Usage: GENI Omni Command Line Aggregate Manager Tool Version 2.11 -Copyright (c) 2011-2015 Raytheon BBN Technologies +Copyright (c) 2011-2016 Raytheon BBN Technologies omni.py [options] [--project ] diff --git a/acceptance_tests/AM_API/am_api_accept.py b/acceptance_tests/AM_API/am_api_accept.py index 5bc9efd9..e891ac7e 100755 --- a/acceptance_tests/AM_API/am_api_accept.py +++ b/acceptance_tests/AM_API/am_api_accept.py @@ -1,7 +1,7 @@ #!/usr/bin/env python #---------------------------------------------------------------------- -# Copyright (c) 2011-2015 Raytheon BBN Technologies +# Copyright (c) 2011-2016 Raytheon BBN Technologies # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and/or hardware specification (the "Work") to diff --git a/acceptance_tests/AM_API/am_api_accept_delegate.py b/acceptance_tests/AM_API/am_api_accept_delegate.py index 96ec5997..9852bb97 100755 --- a/acceptance_tests/AM_API/am_api_accept_delegate.py +++ b/acceptance_tests/AM_API/am_api_accept_delegate.py @@ -1,7 +1,7 @@ #!/usr/bin/python #---------------------------------------------------------------------- -# Copyright (c) 2011-2015 Raytheon BBN Technologies +# Copyright (c) 2011-2016 Raytheon BBN Technologies # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and/or hardware specification (the "Work") to diff --git a/acceptance_tests/AM_API/am_api_accept_nagios.py b/acceptance_tests/AM_API/am_api_accept_nagios.py index 6380b46d..e46d3c26 100755 --- a/acceptance_tests/AM_API/am_api_accept_nagios.py +++ b/acceptance_tests/AM_API/am_api_accept_nagios.py @@ -1,7 +1,7 @@ #!/usr/bin/env python #---------------------------------------------------------------------- -# Copyright (c) 2012-2015 Raytheon BBN Technologies +# Copyright (c) 2012-2016 Raytheon BBN Technologies # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and/or hardware specification (the "Work") to diff --git a/acceptance_tests/AM_API/am_api_accept_scaling.py b/acceptance_tests/AM_API/am_api_accept_scaling.py index ebf2a133..cee66622 100755 --- a/acceptance_tests/AM_API/am_api_accept_scaling.py +++ b/acceptance_tests/AM_API/am_api_accept_scaling.py @@ -1,7 +1,7 @@ #!/usr/bin/env python #---------------------------------------------------------------------- -# Copyright (c) 2011-2015 Raytheon BBN Technologies +# Copyright (c) 2011-2016 Raytheon BBN Technologies # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and/or hardware specification (the "Work") to diff --git a/acceptance_tests/AM_API/am_api_accept_shutdown.py b/acceptance_tests/AM_API/am_api_accept_shutdown.py index 86f771a6..439d1d25 100755 --- a/acceptance_tests/AM_API/am_api_accept_shutdown.py +++ b/acceptance_tests/AM_API/am_api_accept_shutdown.py @@ -1,7 +1,7 @@ #!/usr/bin/python #---------------------------------------------------------------------- -# Copyright (c) 2011-2015 Raytheon BBN Technologies +# Copyright (c) 2011-2016 Raytheon BBN Technologies # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and/or hardware specification (the "Work") to diff --git a/debian/copyright b/debian/copyright index 0a1e175e..1e0d6d5e 100644 --- a/debian/copyright +++ b/debian/copyright @@ -3,7 +3,7 @@ Upstream-Name: geni-tools Source: https://github.com/GENI-NSF/geni-tools Files: * -Copyright: Copyright (c) 2012-2015 Raytheon BBN Technologies +Copyright: Copyright (c) 2012-2016 Raytheon BBN Technologies License: GENI Public License Permission is hereby granted, free of charge, to any person obtaining a copy of this software and/or hardware specification (the "Work") to diff --git a/examples/addMemberToSliceAndSlivers.py b/examples/addMemberToSliceAndSlivers.py index faabd729..e8bcb6a8 100755 --- a/examples/addMemberToSliceAndSlivers.py +++ b/examples/addMemberToSliceAndSlivers.py @@ -1,7 +1,7 @@ #!/usr/bin/env python #---------------------------------------------------------------------- -# Copyright (c) 2012-2015 Raytheon BBN Technologies +# Copyright (c) 2012-2016 Raytheon BBN Technologies # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and/or hardware specification (the "Work") to diff --git a/examples/expirationofmyslices.py b/examples/expirationofmyslices.py index 677d5554..1469fcb1 100755 --- a/examples/expirationofmyslices.py +++ b/examples/expirationofmyslices.py @@ -1,7 +1,7 @@ #!/usr/bin/env python #---------------------------------------------------------------------- -# Copyright (c) 2011-2015 Raytheon BBN Technologies +# Copyright (c) 2011-2016 Raytheon BBN Technologies # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and/or hardware specification (the "Work") to diff --git a/examples/myscript.py b/examples/myscript.py index dfae8154..bcfd0a4a 100755 --- a/examples/myscript.py +++ b/examples/myscript.py @@ -1,7 +1,7 @@ #!/usr/bin/env python #---------------------------------------------------------------------- -# Copyright (c) 2012-2015 Raytheon BBN Technologies +# Copyright (c) 2012-2016 Raytheon BBN Technologies # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and/or hardware specification (the "Work") to diff --git a/examples/readyToLogin.py b/examples/readyToLogin.py index b1a91f9e..9083fa65 100755 --- a/examples/readyToLogin.py +++ b/examples/readyToLogin.py @@ -1,7 +1,7 @@ #!/usr/bin/env python #---------------------------------------------------------------------- -# Copyright (c) 2011-2015 Raytheon BBN Technologies +# Copyright (c) 2011-2016 Raytheon BBN Technologies # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and/or hardware specification (the "Work") to diff --git a/examples/remote-execute.py b/examples/remote-execute.py index e4b68bc2..2b5bf2b4 100755 --- a/examples/remote-execute.py +++ b/examples/remote-execute.py @@ -1,7 +1,7 @@ #!/usr/bin/env python #---------------------------------------------------------------------- -# Copyright (c) 2011-2015 Raytheon BBN Technologies +# Copyright (c) 2011-2016 Raytheon BBN Technologies # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and/or hardware specification (the "Work") to diff --git a/examples/renewSliceAndSlivers.py b/examples/renewSliceAndSlivers.py index 0e33a38a..604387ef 100755 --- a/examples/renewSliceAndSlivers.py +++ b/examples/renewSliceAndSlivers.py @@ -1,7 +1,7 @@ #!/usr/bin/env python #---------------------------------------------------------------------- -# Copyright (c) 2012-2015 Raytheon BBN Technologies +# Copyright (c) 2012-2016 Raytheon BBN Technologies # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and/or hardware specification (the "Work") to diff --git a/mac_install/addAliases.command b/mac_install/addAliases.command index a554769e..de08836a 100755 --- a/mac_install/addAliases.command +++ b/mac_install/addAliases.command @@ -1,7 +1,7 @@ #!/bin/bash #---------------------------------------------------------------------- -# Copyright (c) 2014-2015 Raytheon BBN Technologies +# Copyright (c) 2014-2016 Raytheon BBN Technologies # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and/or hardware specification (the "Work") to diff --git a/src/clear-passphrases.py b/src/clear-passphrases.py index f568ac74..e798d90e 100755 --- a/src/clear-passphrases.py +++ b/src/clear-passphrases.py @@ -1,7 +1,7 @@ #!/usr/bin/env python #---------------------------------------------------------------------- -# Copyright (c) 2011-2015 Raytheon BBN Technologies +# Copyright (c) 2011-2016 Raytheon BBN Technologies # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and/or hardware specification (the "Work") to diff --git a/src/delegateSliceCred.py b/src/delegateSliceCred.py index 72755dea..ca146ae9 100755 --- a/src/delegateSliceCred.py +++ b/src/delegateSliceCred.py @@ -1,7 +1,7 @@ #!/usr/bin/env python #---------------------------------------------------------------------- -# Copyright (c) 2011-2015 Raytheon BBN Technologies +# Copyright (c) 2011-2016 Raytheon BBN Technologies # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and/or hardware specification (the "Work") to diff --git a/src/gcf-am-gib.py b/src/gcf-am-gib.py index 11e18019..5f70de55 100755 --- a/src/gcf-am-gib.py +++ b/src/gcf-am-gib.py @@ -1,7 +1,7 @@ #!/usr/bin/env python #---------------------------------------------------------------------- -# Copyright (c) 2012-2015 Raytheon BBN Technologies +# Copyright (c) 2012-2016 Raytheon BBN Technologies # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and/or hardware specification (the "Work") to diff --git a/src/gcf-am.py b/src/gcf-am.py index 63a0f050..b812631d 100755 --- a/src/gcf-am.py +++ b/src/gcf-am.py @@ -1,7 +1,7 @@ #!/usr/bin/env python #---------------------------------------------------------------------- -# Copyright (c) 2012-2015 Raytheon BBN Technologies +# Copyright (c) 2012-2016 Raytheon BBN Technologies # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and/or hardware specification (the "Work") to diff --git a/src/gcf-ch.py b/src/gcf-ch.py index bfde2e8e..d013f529 100755 --- a/src/gcf-ch.py +++ b/src/gcf-ch.py @@ -1,7 +1,7 @@ #!/usr/bin/env python #---------------------------------------------------------------------- -# Copyright (c) 2010-2015 Raytheon BBN Technologies +# Copyright (c) 2010-2016 Raytheon BBN Technologies # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and/or hardware specification (the "Work") to diff --git a/src/gcf-gch-gib.py b/src/gcf-gch-gib.py index 4488dd82..be23d6d4 100755 --- a/src/gcf-gch-gib.py +++ b/src/gcf-gch-gib.py @@ -1,7 +1,7 @@ #!/usr/bin/env python #---------------------------------------------------------------------- -# Copyright (c) 2010-2015 Raytheon BBN Technologies +# Copyright (c) 2010-2016 Raytheon BBN Technologies # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and/or hardware specification (the "Work") to diff --git a/src/gcf-gch.py b/src/gcf-gch.py index a066d5a7..385728ee 100755 --- a/src/gcf-gch.py +++ b/src/gcf-gch.py @@ -1,7 +1,7 @@ #!/usr/bin/env python #---------------------------------------------------------------------- -# Copyright (c) 2012-2015 Raytheon BBN Technologies +# Copyright (c) 2012-2016 Raytheon BBN Technologies # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and/or hardware specification (the "Work") to diff --git a/src/gcf-pgch.py b/src/gcf-pgch.py index 2ce07565..ea4d9916 100755 --- a/src/gcf-pgch.py +++ b/src/gcf-pgch.py @@ -1,7 +1,7 @@ #!/usr/bin/env python #---------------------------------------------------------------------- -# Copyright (c) 2010-2015 Raytheon BBN Technologies +# Copyright (c) 2010-2016 Raytheon BBN Technologies # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and/or hardware specification (the "Work") to diff --git a/src/gcf-proxy-test.py b/src/gcf-proxy-test.py index 83c748f1..7a4349ad 100755 --- a/src/gcf-proxy-test.py +++ b/src/gcf-proxy-test.py @@ -1,7 +1,7 @@ #!/usr/bin/env python #---------------------------------------------------------------------- -# Copyright (c) 2010-2015 Raytheon BBN Technologies +# Copyright (c) 2010-2016 Raytheon BBN Technologies # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and/or hardware specification (the "Work") to diff --git a/src/gcf-proxy.py b/src/gcf-proxy.py index 8f1ea28c..fd851fe6 100755 --- a/src/gcf-proxy.py +++ b/src/gcf-proxy.py @@ -1,7 +1,7 @@ #!/usr/bin/env python #---------------------------------------------------------------------- -# Copyright (c) 2011-2015 Raytheon BBN Technologies +# Copyright (c) 2011-2016 Raytheon BBN Technologies # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and/or hardware specification (the "Work") to diff --git a/src/gcf-test.py b/src/gcf-test.py index 13db9a73..7c636306 100755 --- a/src/gcf-test.py +++ b/src/gcf-test.py @@ -1,7 +1,7 @@ #!/usr/bin/env python #---------------------------------------------------------------------- -# Copyright (c) 2010-2015 Raytheon BBN Technologies +# Copyright (c) 2010-2016 Raytheon BBN Technologies # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and/or hardware specification (the "Work") to diff --git a/src/gcf/gcf_version.py b/src/gcf/gcf_version.py index 51b7c8dd..1e5e9dea 100644 --- a/src/gcf/gcf_version.py +++ b/src/gcf/gcf_version.py @@ -1,5 +1,5 @@ #---------------------------------------------------------------------- -# Copyright (c) 2011-2015 Raytheon BBN Technologies +# Copyright (c) 2011-2016 Raytheon BBN Technologies # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and/or hardware specification (the "Work") to diff --git a/src/gcf/geni/SecureThreadedXMLRPCServer.py b/src/gcf/geni/SecureThreadedXMLRPCServer.py index 53aa67b2..508c6e51 100644 --- a/src/gcf/geni/SecureThreadedXMLRPCServer.py +++ b/src/gcf/geni/SecureThreadedXMLRPCServer.py @@ -1,5 +1,5 @@ #---------------------------------------------------------------------- -# Copyright (c) 2010-2015 Raytheon BBN Technologies +# Copyright (c) 2010-2016 Raytheon BBN Technologies # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and/or hardware specification (the "Work") to diff --git a/src/gcf/geni/SecureXMLRPCServer.py b/src/gcf/geni/SecureXMLRPCServer.py index 2c243a48..14eea0b3 100644 --- a/src/gcf/geni/SecureXMLRPCServer.py +++ b/src/gcf/geni/SecureXMLRPCServer.py @@ -1,5 +1,5 @@ #---------------------------------------------------------------------- -# Copyright (c) 2010-2015 Raytheon BBN Technologies +# Copyright (c) 2010-2016 Raytheon BBN Technologies # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and/or hardware specification (the "Work") to diff --git a/src/gcf/geni/__init__.py b/src/gcf/geni/__init__.py index 95063380..99b17b13 100644 --- a/src/gcf/geni/__init__.py +++ b/src/gcf/geni/__init__.py @@ -1,5 +1,5 @@ #---------------------------------------------------------------------- -# Copyright (c) 2010-2015 Raytheon BBN Technologies +# Copyright (c) 2010-2016 Raytheon BBN Technologies # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and/or hardware specification (the "Work") to diff --git a/src/gcf/geni/am/aggregate.py b/src/gcf/geni/am/aggregate.py index 7984c7d6..6e777532 100644 --- a/src/gcf/geni/am/aggregate.py +++ b/src/gcf/geni/am/aggregate.py @@ -1,5 +1,5 @@ #---------------------------------------------------------------------- -# Copyright (c) 2011-2015 Raytheon BBN Technologies +# Copyright (c) 2011-2016 Raytheon BBN Technologies # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and/or hardware specification (the "Work") to diff --git a/src/gcf/geni/am/am2.py b/src/gcf/geni/am/am2.py index 9262c01d..13b6f0be 100644 --- a/src/gcf/geni/am/am2.py +++ b/src/gcf/geni/am/am2.py @@ -1,5 +1,5 @@ #---------------------------------------------------------------------- -# Copyright (c) 2011-2015 Raytheon BBN Technologies +# Copyright (c) 2011-2016 Raytheon BBN Technologies # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and/or hardware specification (the "Work") to diff --git a/src/gcf/geni/am/am3.py b/src/gcf/geni/am/am3.py index 4194f1e5..2e023f35 100644 --- a/src/gcf/geni/am/am3.py +++ b/src/gcf/geni/am/am3.py @@ -1,5 +1,5 @@ #---------------------------------------------------------------------- -# Copyright (c) 2012-2015 Raytheon BBN Technologies +# Copyright (c) 2012-2016 Raytheon BBN Technologies # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and/or hardware specification (the "Work") to diff --git a/src/gcf/geni/am/am_method_context.py b/src/gcf/geni/am/am_method_context.py index e03e11bc..c6e11f4c 100644 --- a/src/gcf/geni/am/am_method_context.py +++ b/src/gcf/geni/am/am_method_context.py @@ -1,5 +1,5 @@ #---------------------------------------------------------------------- -# Copyright (c) 2010-2015 Raytheon BBN Technologies +# Copyright (c) 2010-2016 Raytheon BBN Technologies # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and/or hardware specification (the "Work") to diff --git a/src/gcf/geni/am/api_error_exception.py b/src/gcf/geni/am/api_error_exception.py index 8764925d..1ee96654 100644 --- a/src/gcf/geni/am/api_error_exception.py +++ b/src/gcf/geni/am/api_error_exception.py @@ -1,5 +1,5 @@ #---------------------------------------------------------------------- -# Copyright (c) 2012-2015 Raytheon BBN Technologies +# Copyright (c) 2012-2016 Raytheon BBN Technologies # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and/or hardware specification (the "Work") to diff --git a/src/gcf/geni/am/fakevm.py b/src/gcf/geni/am/fakevm.py index 77ad4194..3eeb3854 100644 --- a/src/gcf/geni/am/fakevm.py +++ b/src/gcf/geni/am/fakevm.py @@ -1,5 +1,5 @@ #---------------------------------------------------------------------- -# Copyright (c) 2011-2015 Raytheon BBN Technologies +# Copyright (c) 2011-2016 Raytheon BBN Technologies # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and/or hardware specification (the "Work") to diff --git a/src/gcf/geni/am/gibaggregate/am_gib.py b/src/gcf/geni/am/gibaggregate/am_gib.py index edd0dd86..0e28b8a0 100644 --- a/src/gcf/geni/am/gibaggregate/am_gib.py +++ b/src/gcf/geni/am/gibaggregate/am_gib.py @@ -1,5 +1,5 @@ #---------------------------------------------------------------------- -# Copyright (c) 2011-2015 Raytheon BBN Technologies +# Copyright (c) 2011-2016 Raytheon BBN Technologies # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and/or hardware specification (the "Work") to diff --git a/src/gcf/geni/am/gibaggregate/config.py b/src/gcf/geni/am/gibaggregate/config.py index e24c27e3..2042c8cf 100644 --- a/src/gcf/geni/am/gibaggregate/config.py +++ b/src/gcf/geni/am/gibaggregate/config.py @@ -1,5 +1,5 @@ #---------------------------------------------------------------------- -# Copyright (c) 2012-2015 Raytheon BBN Technologies +# Copyright (c) 2012-2016 Raytheon BBN Technologies # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and/or hardware specification (the "Work") to diff --git a/src/gcf/geni/am/gibaggregate/gib_manager.py b/src/gcf/geni/am/gibaggregate/gib_manager.py index fd08d689..606f0d63 100644 --- a/src/gcf/geni/am/gibaggregate/gib_manager.py +++ b/src/gcf/geni/am/gibaggregate/gib_manager.py @@ -1,5 +1,5 @@ #---------------------------------------------------------------------- -# Copyright (c) 2012-2015 Raytheon BBN Technologies +# Copyright (c) 2012-2016 Raytheon BBN Technologies # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and/or hardware specification (the "Work") to diff --git a/src/gcf/geni/am/gibaggregate/graphUtils.py b/src/gcf/geni/am/gibaggregate/graphUtils.py index 932e4a3b..7403e6a5 100644 --- a/src/gcf/geni/am/gibaggregate/graphUtils.py +++ b/src/gcf/geni/am/gibaggregate/graphUtils.py @@ -1,5 +1,5 @@ #---------------------------------------------------------------------- -# Copyright (c) 2012-2015 Raytheon BBN Technologies +# Copyright (c) 2012-2016 Raytheon BBN Technologies # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and/or hardware specification (the "Work") to diff --git a/src/gcf/geni/am/gibaggregate/resources.py b/src/gcf/geni/am/gibaggregate/resources.py index 278a66f4..53a66095 100644 --- a/src/gcf/geni/am/gibaggregate/resources.py +++ b/src/gcf/geni/am/gibaggregate/resources.py @@ -1,5 +1,5 @@ #---------------------------------------------------------------------- -# Copyright (c) 2012-2015 Raytheon BBN Technologies +# Copyright (c) 2012-2016 Raytheon BBN Technologies # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and/or hardware specification (the "Work") to diff --git a/src/gcf/geni/am/gibaggregate/rspec_handler.py b/src/gcf/geni/am/gibaggregate/rspec_handler.py index a38df2f4..730bbcc1 100644 --- a/src/gcf/geni/am/gibaggregate/rspec_handler.py +++ b/src/gcf/geni/am/gibaggregate/rspec_handler.py @@ -1,5 +1,5 @@ #---------------------------------------------------------------------- -# Copyright (c) 2012-2015 Raytheon BBN Technologies +# Copyright (c) 2012-2016 Raytheon BBN Technologies # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and/or hardware specification (the "Work") to diff --git a/src/gcf/geni/am/gibaggregate/standardScripts/deleteSliver.sh b/src/gcf/geni/am/gibaggregate/standardScripts/deleteSliver.sh index 45a4f662..93f6d06a 100755 --- a/src/gcf/geni/am/gibaggregate/standardScripts/deleteSliver.sh +++ b/src/gcf/geni/am/gibaggregate/standardScripts/deleteSliver.sh @@ -1,7 +1,7 @@ #!/bin/bash #---------------------------------------------------------------------- -# Copyright (c) 2012-2015 Raytheon BBN Technologies +# Copyright (c) 2012-2016 Raytheon BBN Technologies # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and/or hardware specification (the "Work") to diff --git a/src/gcf/geni/am/gibaggregate/standardScripts/hostSetup.sh b/src/gcf/geni/am/gibaggregate/standardScripts/hostSetup.sh index 9cac26d4..ca9ae3dd 100755 --- a/src/gcf/geni/am/gibaggregate/standardScripts/hostSetup.sh +++ b/src/gcf/geni/am/gibaggregate/standardScripts/hostSetup.sh @@ -1,7 +1,7 @@ #!/bin/bash #---------------------------------------------------------------------- -# Copyright (c) 2012-2015 Raytheon BBN Technologies +# Copyright (c) 2012-2016 Raytheon BBN Technologies # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and/or hardware specification (the "Work") to diff --git a/src/gcf/geni/am/proxyam.py b/src/gcf/geni/am/proxyam.py index c06bff04..38c1cff2 100644 --- a/src/gcf/geni/am/proxyam.py +++ b/src/gcf/geni/am/proxyam.py @@ -1,5 +1,5 @@ #---------------------------------------------------------------------- -# Copyright (c) 2012-2015 Raytheon BBN Technologies +# Copyright (c) 2012-2016 Raytheon BBN Technologies # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and/or hardware specification (the "Work") to diff --git a/src/gcf/geni/am/resource.py b/src/gcf/geni/am/resource.py index 697c5648..5ed0cc30 100644 --- a/src/gcf/geni/am/resource.py +++ b/src/gcf/geni/am/resource.py @@ -1,5 +1,5 @@ #---------------------------------------------------------------------- -# Copyright (c) 2011-2015 Raytheon BBN Technologies +# Copyright (c) 2011-2016 Raytheon BBN Technologies # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and/or hardware specification (the "Work") to diff --git a/src/gcf/geni/am1.py b/src/gcf/geni/am1.py index 0cdc865e..b5ec4e11 100644 --- a/src/gcf/geni/am1.py +++ b/src/gcf/geni/am1.py @@ -1,5 +1,5 @@ #---------------------------------------------------------------------- -# Copyright (c) 2011-2015 Raytheon BBN Technologies +# Copyright (c) 2011-2016 Raytheon BBN Technologies # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and/or hardware specification (the "Work") to diff --git a/src/gcf/geni/auth/abac_authorizer.py b/src/gcf/geni/auth/abac_authorizer.py index e906f4d2..bb2662ef 100644 --- a/src/gcf/geni/auth/abac_authorizer.py +++ b/src/gcf/geni/auth/abac_authorizer.py @@ -1,5 +1,5 @@ #---------------------------------------------------------------------- -# Copyright (c) 2010-2015 Raytheon BBN Technologies +# Copyright (c) 2010-2016 Raytheon BBN Technologies # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and/or hardware specification (the "Work") to diff --git a/src/gcf/geni/auth/abac_resource_manager.py b/src/gcf/geni/auth/abac_resource_manager.py index 697772a3..ef46840d 100644 --- a/src/gcf/geni/auth/abac_resource_manager.py +++ b/src/gcf/geni/auth/abac_resource_manager.py @@ -1,5 +1,5 @@ #---------------------------------------------------------------------- -# Copyright (c) 2010-2015 Raytheon BBN Technologies +# Copyright (c) 2010-2016 Raytheon BBN Technologies # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and/or hardware specification (the "Work") to diff --git a/src/gcf/geni/auth/argument_guard.py b/src/gcf/geni/auth/argument_guard.py index ee26ea6e..7aa64902 100644 --- a/src/gcf/geni/auth/argument_guard.py +++ b/src/gcf/geni/auth/argument_guard.py @@ -1,5 +1,5 @@ #---------------------------------------------------------------------- -# Copyright (c) 2011-2015 Raytheon BBN Technologies +# Copyright (c) 2011-2016 Raytheon BBN Technologies # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and/or hardware specification (the "Work") to diff --git a/src/gcf/geni/auth/authorizer_client.py b/src/gcf/geni/auth/authorizer_client.py index b4bf4dfb..36ecd3f3 100644 --- a/src/gcf/geni/auth/authorizer_client.py +++ b/src/gcf/geni/auth/authorizer_client.py @@ -1,5 +1,5 @@ #---------------------------------------------------------------------- -# Copyright (c) 2010-2015 Raytheon BBN Technologies +# Copyright (c) 2010-2016 Raytheon BBN Technologies # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and/or hardware specification (the "Work") to diff --git a/src/gcf/geni/auth/authorizer_server.py b/src/gcf/geni/auth/authorizer_server.py index 2b85a7d0..e8295c1b 100644 --- a/src/gcf/geni/auth/authorizer_server.py +++ b/src/gcf/geni/auth/authorizer_server.py @@ -1,5 +1,5 @@ #---------------------------------------------------------------------- -# Copyright (c) 2010-2015 Raytheon BBN Technologies +# Copyright (c) 2010-2016 Raytheon BBN Technologies # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and/or hardware specification (the "Work") to diff --git a/src/gcf/geni/auth/base_authorizer.py b/src/gcf/geni/auth/base_authorizer.py index 5828eb4e..baa6991f 100644 --- a/src/gcf/geni/auth/base_authorizer.py +++ b/src/gcf/geni/auth/base_authorizer.py @@ -1,5 +1,5 @@ #---------------------------------------------------------------------- -# Copyright (c) 2010-2015 Raytheon BBN Technologies +# Copyright (c) 2010-2016 Raytheon BBN Technologies # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and/or hardware specification (the "Work") to diff --git a/src/gcf/geni/auth/binders.py b/src/gcf/geni/auth/binders.py index 91ac3d33..88d5ccab 100644 --- a/src/gcf/geni/auth/binders.py +++ b/src/gcf/geni/auth/binders.py @@ -1,5 +1,5 @@ #---------------------------------------------------------------------- -# Copyright (c) 2012-2015 Raytheon BBN Technologies +# Copyright (c) 2012-2016 Raytheon BBN Technologies # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and/or hardware specification (the "Work") to diff --git a/src/gcf/geni/auth/resource_binder.py b/src/gcf/geni/auth/resource_binder.py index 09f5dd07..ec9fbf52 100644 --- a/src/gcf/geni/auth/resource_binder.py +++ b/src/gcf/geni/auth/resource_binder.py @@ -1,5 +1,5 @@ #---------------------------------------------------------------------- -# Copyright (c) 2010-2015 Raytheon BBN Technologies +# Copyright (c) 2010-2016 Raytheon BBN Technologies # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and/or hardware specification (the "Work") to diff --git a/src/gcf/geni/auth/sfa_authorizer.py b/src/gcf/geni/auth/sfa_authorizer.py index b41cf636..2631c3e6 100644 --- a/src/gcf/geni/auth/sfa_authorizer.py +++ b/src/gcf/geni/auth/sfa_authorizer.py @@ -1,5 +1,5 @@ #---------------------------------------------------------------------- -# Copyright (c) 2010-2015 Raytheon BBN Technologies +# Copyright (c) 2010-2016 Raytheon BBN Technologies # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and/or hardware specification (the "Work") to diff --git a/src/gcf/geni/auth/util.py b/src/gcf/geni/auth/util.py index 5c9db368..64cdbff8 100644 --- a/src/gcf/geni/auth/util.py +++ b/src/gcf/geni/auth/util.py @@ -1,5 +1,5 @@ #---------------------------------------------------------------------- -# Copyright (c) 2012-2015 Raytheon BBN Technologies +# Copyright (c) 2012-2016 Raytheon BBN Technologies # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and/or hardware specification (the "Work") to diff --git a/src/gcf/geni/ca.py b/src/gcf/geni/ca.py index 549ae042..3cf7b8e9 100644 --- a/src/gcf/geni/ca.py +++ b/src/gcf/geni/ca.py @@ -1,5 +1,5 @@ #---------------------------------------------------------------------- -# Copyright (c) 2010-2015 Raytheon BBN Technologies +# Copyright (c) 2010-2016 Raytheon BBN Technologies # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and/or hardware specification (the "Work") to diff --git a/src/gcf/geni/ch.py b/src/gcf/geni/ch.py index 849f1add..9fa9f1f5 100644 --- a/src/gcf/geni/ch.py +++ b/src/gcf/geni/ch.py @@ -1,5 +1,5 @@ #---------------------------------------------------------------------- -# Copyright (c) 2011-2015 Raytheon BBN Technologies +# Copyright (c) 2011-2016 Raytheon BBN Technologies # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and/or hardware specification (the "Work") to diff --git a/src/gcf/geni/config.py b/src/gcf/geni/config.py index 780fe249..273c40d8 100644 --- a/src/gcf/geni/config.py +++ b/src/gcf/geni/config.py @@ -1,5 +1,5 @@ #---------------------------------------------------------------------- -# Copyright (c) 2010-2015 Raytheon BBN Technologies +# Copyright (c) 2010-2016 Raytheon BBN Technologies # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and/or hardware specification (the "Work") to diff --git a/src/gcf/geni/gch.py b/src/gcf/geni/gch.py index 064e2117..9dcba451 100644 --- a/src/gcf/geni/gch.py +++ b/src/gcf/geni/gch.py @@ -1,5 +1,5 @@ #---------------------------------------------------------------------- -# Copyright (c) 2011-2015 Raytheon BBN Technologies +# Copyright (c) 2011-2016 Raytheon BBN Technologies # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and/or hardware specification (the "Work") to diff --git a/src/gcf/geni/pgch.py b/src/gcf/geni/pgch.py index 1b3b654e..4fea8260 100644 --- a/src/gcf/geni/pgch.py +++ b/src/gcf/geni/pgch.py @@ -1,5 +1,5 @@ #---------------------------------------------------------------------- -# Copyright (c) 2011-2015 Raytheon BBN Technologies +# Copyright (c) 2011-2016 Raytheon BBN Technologies # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and/or hardware specification (the "Work") to diff --git a/src/gcf/geni/util/cert_util.py b/src/gcf/geni/util/cert_util.py index 4a7924d0..9f4e8ac3 100644 --- a/src/gcf/geni/util/cert_util.py +++ b/src/gcf/geni/util/cert_util.py @@ -1,5 +1,5 @@ #---------------------------------------------------------------------- -# Copyright (c) 2011-2015 Raytheon BBN Technologies +# Copyright (c) 2011-2016 Raytheon BBN Technologies # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and/or hardware specification (the "Work") to diff --git a/src/gcf/geni/util/ch_interface.py b/src/gcf/geni/util/ch_interface.py index 89a5e78a..108be0cd 100644 --- a/src/gcf/geni/util/ch_interface.py +++ b/src/gcf/geni/util/ch_interface.py @@ -1,5 +1,5 @@ #---------------------------------------------------------------------- -# Copyright (c) 2012-2015 Raytheon BBN Technologies +# Copyright (c) 2012-2016 Raytheon BBN Technologies # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and/or hardware specification (the "Work") to diff --git a/src/gcf/geni/util/cred_util.py b/src/gcf/geni/util/cred_util.py index 9e17d325..1c183c83 100644 --- a/src/gcf/geni/util/cred_util.py +++ b/src/gcf/geni/util/cred_util.py @@ -1,5 +1,5 @@ #---------------------------------------------------------------------- -# Copyright (c) 2010-2015 Raytheon BBN Technologies +# Copyright (c) 2010-2016 Raytheon BBN Technologies # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and/or hardware specification (the "Work") to diff --git a/src/gcf/geni/util/error_util.py b/src/gcf/geni/util/error_util.py index 086110e1..da1264bf 100644 --- a/src/gcf/geni/util/error_util.py +++ b/src/gcf/geni/util/error_util.py @@ -1,7 +1,7 @@ #!/usr/bin/python #---------------------------------------------------------------------- -# Copyright (c) 2012-2015 Raytheon BBN Technologies +# Copyright (c) 2012-2016 Raytheon BBN Technologies # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and/or hardware specification (the "Work") to diff --git a/src/gcf/geni/util/rspec_schema.py b/src/gcf/geni/util/rspec_schema.py index 3200770a..2e574137 100644 --- a/src/gcf/geni/util/rspec_schema.py +++ b/src/gcf/geni/util/rspec_schema.py @@ -1,7 +1,7 @@ #!/usr/bin/python #---------------------------------------------------------------------- -# Copyright (c) 2011-2015 Raytheon BBN Technologies +# Copyright (c) 2011-2016 Raytheon BBN Technologies # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and/or hardware specification (the "Work") to diff --git a/src/gcf/geni/util/rspec_util.py b/src/gcf/geni/util/rspec_util.py index 6810ca6b..b839f12d 100755 --- a/src/gcf/geni/util/rspec_util.py +++ b/src/gcf/geni/util/rspec_util.py @@ -1,7 +1,7 @@ #!/usr/bin/python #---------------------------------------------------------------------- -# Copyright (c) 2011-2015 Raytheon BBN Technologies +# Copyright (c) 2011-2016 Raytheon BBN Technologies # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and/or hardware specification (the "Work") to diff --git a/src/gcf/geni/util/secure_xmlrpc_client.py b/src/gcf/geni/util/secure_xmlrpc_client.py index d7a9e9ae..e1f65222 100644 --- a/src/gcf/geni/util/secure_xmlrpc_client.py +++ b/src/gcf/geni/util/secure_xmlrpc_client.py @@ -1,5 +1,5 @@ #---------------------------------------------------------------------- -# Copyright (c) 2010-2015 Raytheon BBN Technologies +# Copyright (c) 2010-2016 Raytheon BBN Technologies # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and/or hardware specification (the "Work") to diff --git a/src/gcf/geni/util/speaksfor_util.py b/src/gcf/geni/util/speaksfor_util.py index c45b2757..93c498b7 100644 --- a/src/gcf/geni/util/speaksfor_util.py +++ b/src/gcf/geni/util/speaksfor_util.py @@ -1,5 +1,5 @@ #---------------------------------------------------------------------- -# Copyright (c) 2014-2015 Raytheon BBN Technologies +# Copyright (c) 2014-2016 Raytheon BBN Technologies # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and/or hardware specification (the "Work") to diff --git a/src/gcf/geni/util/tz_util.py b/src/gcf/geni/util/tz_util.py index a7c0bbab..bf849544 100644 --- a/src/gcf/geni/util/tz_util.py +++ b/src/gcf/geni/util/tz_util.py @@ -1,7 +1,7 @@ #!/usr/bin/python #---------------------------------------------------------------------- -# Copyright (c) 2014-2015 Raytheon BBN Technologies +# Copyright (c) 2014-2016 Raytheon BBN Technologies # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and/or hardware specification (the "Work") to diff --git a/src/gcf/geni/util/urn_util.py b/src/gcf/geni/util/urn_util.py index 444cfbed..164c3d22 100644 --- a/src/gcf/geni/util/urn_util.py +++ b/src/gcf/geni/util/urn_util.py @@ -1,5 +1,5 @@ #---------------------------------------------------------------------- -# Copyright (c) 2010-2015 Raytheon BBN Technologies +# Copyright (c) 2010-2016 Raytheon BBN Technologies # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and/or hardware specification (the "Work") to diff --git a/src/gcf/omnilib/amhandler.py b/src/gcf/omnilib/amhandler.py index 8e2951fa..e9a6c622 100644 --- a/src/gcf/omnilib/amhandler.py +++ b/src/gcf/omnilib/amhandler.py @@ -3,7 +3,7 @@ from __future__ import absolute_import #---------------------------------------------------------------------- -# Copyright (c) 2012-2015 Raytheon BBN Technologies +# Copyright (c) 2012-2016 Raytheon BBN Technologies # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and/or hardware specification (the "Work") to diff --git a/src/gcf/omnilib/chhandler.py b/src/gcf/omnilib/chhandler.py index 3e5e5f20..c70dce55 100644 --- a/src/gcf/omnilib/chhandler.py +++ b/src/gcf/omnilib/chhandler.py @@ -3,7 +3,7 @@ from __future__ import absolute_import #---------------------------------------------------------------------- -# Copyright (c) 2012-2015 Raytheon BBN Technologies +# Copyright (c) 2012-2016 Raytheon BBN Technologies # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and/or hardware specification (the "Work") to diff --git a/src/gcf/omnilib/frameworks/framework_apg.py b/src/gcf/omnilib/frameworks/framework_apg.py index 61364ad3..526ff089 100644 --- a/src/gcf/omnilib/frameworks/framework_apg.py +++ b/src/gcf/omnilib/frameworks/framework_apg.py @@ -1,6 +1,6 @@ #---------------------------------------------------------------------- # Copyright (c) 2011 USC/ISI -# Portions Copyright (c) 2011-2015 Raytheon BBN Technologies +# Portions Copyright (c) 2011-2016 Raytheon BBN Technologies # # Permission is hereby granted, free of charge, to any person # obtaining a copy of this software and/or hardware specification (the diff --git a/src/gcf/omnilib/frameworks/framework_base.py b/src/gcf/omnilib/frameworks/framework_base.py index 7afe7243..3a4a8bf9 100644 --- a/src/gcf/omnilib/frameworks/framework_base.py +++ b/src/gcf/omnilib/frameworks/framework_base.py @@ -1,5 +1,5 @@ #---------------------------------------------------------------------- -# Copyright (c) 2011-2015 Raytheon BBN Technologies +# Copyright (c) 2011-2016 Raytheon BBN Technologies # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and/or hardware specification (the "Work") to diff --git a/src/gcf/omnilib/frameworks/framework_chapi.py b/src/gcf/omnilib/frameworks/framework_chapi.py index ef8ccc3a..57f10ec3 100644 --- a/src/gcf/omnilib/frameworks/framework_chapi.py +++ b/src/gcf/omnilib/frameworks/framework_chapi.py @@ -1,5 +1,5 @@ #---------------------------------------------------------------------- -# Copyright (c) 2011-2015 Raytheon BBN Technologies +# Copyright (c) 2011-2016 Raytheon BBN Technologies # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and/or hardware specification (the "Work") to diff --git a/src/gcf/omnilib/frameworks/framework_gcf.py b/src/gcf/omnilib/frameworks/framework_gcf.py index 545d36f5..d8fd77b8 100644 --- a/src/gcf/omnilib/frameworks/framework_gcf.py +++ b/src/gcf/omnilib/frameworks/framework_gcf.py @@ -1,5 +1,5 @@ #---------------------------------------------------------------------- -# Copyright (c) 2011-2015 Raytheon BBN Technologies +# Copyright (c) 2011-2016 Raytheon BBN Technologies # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and/or hardware specification (the "Work") to diff --git a/src/gcf/omnilib/frameworks/framework_gch.py b/src/gcf/omnilib/frameworks/framework_gch.py index 2fe7b24a..dba8250b 100644 --- a/src/gcf/omnilib/frameworks/framework_gch.py +++ b/src/gcf/omnilib/frameworks/framework_gch.py @@ -1,5 +1,5 @@ #---------------------------------------------------------------------- -# Copyright (c) 2011-2015 Raytheon BBN Technologies +# Copyright (c) 2011-2016 Raytheon BBN Technologies # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and/or hardware specification (the "Work") to diff --git a/src/gcf/omnilib/frameworks/framework_gib.py b/src/gcf/omnilib/frameworks/framework_gib.py index 787542db..09c19d43 100644 --- a/src/gcf/omnilib/frameworks/framework_gib.py +++ b/src/gcf/omnilib/frameworks/framework_gib.py @@ -1,5 +1,5 @@ #---------------------------------------------------------------------- -# Copyright (c) 2012-2015 Raytheon BBN Technologies +# Copyright (c) 2012-2016 Raytheon BBN Technologies # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and/or hardware specification (the "Work") to diff --git a/src/gcf/omnilib/frameworks/framework_of.py b/src/gcf/omnilib/frameworks/framework_of.py index 5bcdb62b..809c9c12 100644 --- a/src/gcf/omnilib/frameworks/framework_of.py +++ b/src/gcf/omnilib/frameworks/framework_of.py @@ -1,5 +1,5 @@ #---------------------------------------------------------------------- -# Copyright (c) 2011-2015 Raytheon BBN Technologies +# Copyright (c) 2011-2016 Raytheon BBN Technologies # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and/or hardware specification (the "Work") to diff --git a/src/gcf/omnilib/frameworks/framework_pg.py b/src/gcf/omnilib/frameworks/framework_pg.py index 762229b4..c5260020 100644 --- a/src/gcf/omnilib/frameworks/framework_pg.py +++ b/src/gcf/omnilib/frameworks/framework_pg.py @@ -1,5 +1,5 @@ #---------------------------------------------------------------------- -# Copyright (c) 2011-2015 Raytheon BBN Technologies +# Copyright (c) 2011-2016 Raytheon BBN Technologies # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and/or hardware specification (the "Work") to diff --git a/src/gcf/omnilib/frameworks/framework_pgch.py b/src/gcf/omnilib/frameworks/framework_pgch.py index e8e02d59..96c525ce 100644 --- a/src/gcf/omnilib/frameworks/framework_pgch.py +++ b/src/gcf/omnilib/frameworks/framework_pgch.py @@ -1,5 +1,5 @@ #---------------------------------------------------------------------- -# Copyright (c) 2012-2015 Raytheon BBN Technologies +# Copyright (c) 2012-2016 Raytheon BBN Technologies # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and/or hardware specification (the "Work") to diff --git a/src/gcf/omnilib/frameworks/framework_sfa.py b/src/gcf/omnilib/frameworks/framework_sfa.py index 047b7156..a9955c33 100644 --- a/src/gcf/omnilib/frameworks/framework_sfa.py +++ b/src/gcf/omnilib/frameworks/framework_sfa.py @@ -1,5 +1,5 @@ #---------------------------------------------------------------------- -# Copyright (c) 2011-2015 Raytheon BBN Technologies +# Copyright (c) 2011-2016 Raytheon BBN Technologies # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and/or hardware specification (the "Work") to diff --git a/src/gcf/omnilib/handler.py b/src/gcf/omnilib/handler.py index 01f1abf7..a560497a 100644 --- a/src/gcf/omnilib/handler.py +++ b/src/gcf/omnilib/handler.py @@ -3,7 +3,7 @@ from __future__ import absolute_import #---------------------------------------------------------------------- -# Copyright (c) 2012-2015 Raytheon BBN Technologies +# Copyright (c) 2012-2016 Raytheon BBN Technologies # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and/or hardware specification (the "Work") to diff --git a/src/gcf/omnilib/stitch/GENIObject.py b/src/gcf/omnilib/stitch/GENIObject.py index 3f0b24ca..5553be7f 100644 --- a/src/gcf/omnilib/stitch/GENIObject.py +++ b/src/gcf/omnilib/stitch/GENIObject.py @@ -1,5 +1,5 @@ #---------------------------------------------------------------------- -# Copyright (c) 2013-2015 Raytheon BBN Technologies +# Copyright (c) 2013-2016 Raytheon BBN Technologies # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and/or hardware specification (the "Work") to diff --git a/src/gcf/omnilib/stitch/ManifestRSpecCombiner.py b/src/gcf/omnilib/stitch/ManifestRSpecCombiner.py index 8a6f37a6..8ec1f1cc 100644 --- a/src/gcf/omnilib/stitch/ManifestRSpecCombiner.py +++ b/src/gcf/omnilib/stitch/ManifestRSpecCombiner.py @@ -1,5 +1,5 @@ #---------------------------------------------------------------------- -# Copyright (c) 2013-2015 Raytheon BBN Technologies +# Copyright (c) 2013-2016 Raytheon BBN Technologies # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and/or hardware specification (the "Work") to diff --git a/src/gcf/omnilib/stitch/RSpecParser.py b/src/gcf/omnilib/stitch/RSpecParser.py index e82f0830..8451bda1 100644 --- a/src/gcf/omnilib/stitch/RSpecParser.py +++ b/src/gcf/omnilib/stitch/RSpecParser.py @@ -1,5 +1,5 @@ #---------------------------------------------------------------------- -# Copyright (c) 2013-2015 Raytheon BBN Technologies +# Copyright (c) 2013-2016 Raytheon BBN Technologies # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and/or hardware specification (the "Work") to diff --git a/src/gcf/omnilib/stitch/VLANRange.py b/src/gcf/omnilib/stitch/VLANRange.py index fd8f7a77..cb06931f 100644 --- a/src/gcf/omnilib/stitch/VLANRange.py +++ b/src/gcf/omnilib/stitch/VLANRange.py @@ -1,5 +1,5 @@ #---------------------------------------------------------------------- -# Copyright (c) 2013-2015 Raytheon BBN Technologies +# Copyright (c) 2013-2016 Raytheon BBN Technologies # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and/or hardware specification (the "Work") to diff --git a/src/gcf/omnilib/stitch/__init__.py b/src/gcf/omnilib/stitch/__init__.py index 5c0c1751..e6ba59d0 100644 --- a/src/gcf/omnilib/stitch/__init__.py +++ b/src/gcf/omnilib/stitch/__init__.py @@ -1,5 +1,5 @@ #---------------------------------------------------------------------- -# Copyright (c) 2013-2015 Raytheon BBN Technologies +# Copyright (c) 2013-2016 Raytheon BBN Technologies # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and/or hardware specification (the "Work") to diff --git a/src/gcf/omnilib/stitch/defs.py b/src/gcf/omnilib/stitch/defs.py index 41fea3e0..4a767bd8 100644 --- a/src/gcf/omnilib/stitch/defs.py +++ b/src/gcf/omnilib/stitch/defs.py @@ -1,5 +1,5 @@ #---------------------------------------------------------------------- -# Copyright (c) 2013-2015 Raytheon BBN Technologies +# Copyright (c) 2013-2016 Raytheon BBN Technologies # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and/or hardware specification (the "Work") to diff --git a/src/gcf/omnilib/stitch/launcher.py b/src/gcf/omnilib/stitch/launcher.py index 21f7fa0b..16509ffe 100644 --- a/src/gcf/omnilib/stitch/launcher.py +++ b/src/gcf/omnilib/stitch/launcher.py @@ -1,5 +1,5 @@ #---------------------------------------------------------------------- -# Copyright (c) 2013-2015 Raytheon BBN Technologies +# Copyright (c) 2013-2016 Raytheon BBN Technologies # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and/or hardware specification (the "Work") to diff --git a/src/gcf/omnilib/stitch/objects.py b/src/gcf/omnilib/stitch/objects.py index fec9f584..6f6cfbfe 100644 --- a/src/gcf/omnilib/stitch/objects.py +++ b/src/gcf/omnilib/stitch/objects.py @@ -1,7 +1,7 @@ #!/usr/bin/env python #---------------------------------------------------------------------- -# Copyright (c) 2013-2015 Raytheon BBN Technologies +# Copyright (c) 2013-2016 Raytheon BBN Technologies # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and/or hardware specification (the "Work") to diff --git a/src/gcf/omnilib/stitch/scs.py b/src/gcf/omnilib/stitch/scs.py index b9db486e..9589c048 100644 --- a/src/gcf/omnilib/stitch/scs.py +++ b/src/gcf/omnilib/stitch/scs.py @@ -1,7 +1,7 @@ #!/usr/bin/env python #---------------------------------------------------------------------- -# Copyright (c) 2013-2015 Raytheon BBN Technologies +# Copyright (c) 2013-2016 Raytheon BBN Technologies # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and/or hardware specification (the "Work") to diff --git a/src/gcf/omnilib/stitch/utils.py b/src/gcf/omnilib/stitch/utils.py index 69151742..98f0586a 100644 --- a/src/gcf/omnilib/stitch/utils.py +++ b/src/gcf/omnilib/stitch/utils.py @@ -1,5 +1,5 @@ #---------------------------------------------------------------------- -# Copyright (c) 2013-2015 Raytheon BBN Technologies +# Copyright (c) 2013-2016 Raytheon BBN Technologies # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and/or hardware specification (the "Work") to diff --git a/src/gcf/omnilib/stitch/workflow.py b/src/gcf/omnilib/stitch/workflow.py index 74f9b64f..eddec1ac 100644 --- a/src/gcf/omnilib/stitch/workflow.py +++ b/src/gcf/omnilib/stitch/workflow.py @@ -1,5 +1,5 @@ #---------------------------------------------------------------------- -# Copyright (c) 2013-2015 Raytheon BBN Technologies +# Copyright (c) 2013-2016 Raytheon BBN Technologies # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and/or hardware specification (the "Work") to diff --git a/src/gcf/omnilib/stitchhandler.py b/src/gcf/omnilib/stitchhandler.py index 1801f309..563f4796 100644 --- a/src/gcf/omnilib/stitchhandler.py +++ b/src/gcf/omnilib/stitchhandler.py @@ -3,7 +3,7 @@ from __future__ import absolute_import #---------------------------------------------------------------------- -# Copyright (c) 2013-2015 Raytheon BBN Technologies +# Copyright (c) 2013-2016 Raytheon BBN Technologies # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and/or hardware specification (the "Work") to diff --git a/src/gcf/omnilib/util/__init__.py b/src/gcf/omnilib/util/__init__.py index fc59f807..74c4c771 100644 --- a/src/gcf/omnilib/util/__init__.py +++ b/src/gcf/omnilib/util/__init__.py @@ -1,5 +1,5 @@ #---------------------------------------------------------------------- -# Copyright (c) 2011-2015 Raytheon BBN Technologies +# Copyright (c) 2011-2016 Raytheon BBN Technologies # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and/or hardware specification (the "Work") to diff --git a/src/gcf/omnilib/util/credparsing.py b/src/gcf/omnilib/util/credparsing.py index 6700e153..c44ff687 100644 --- a/src/gcf/omnilib/util/credparsing.py +++ b/src/gcf/omnilib/util/credparsing.py @@ -1,7 +1,7 @@ #!/usr/bin/python #---------------------------------------------------------------------- -# Copyright (c) 2011-2015 Raytheon BBN Technologies +# Copyright (c) 2011-2016 Raytheon BBN Technologies # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and/or hardware specification (the "Work") to diff --git a/src/gcf/omnilib/util/dates.py b/src/gcf/omnilib/util/dates.py index cf488c18..b309de81 100644 --- a/src/gcf/omnilib/util/dates.py +++ b/src/gcf/omnilib/util/dates.py @@ -1,7 +1,7 @@ #!/usr/bin/python #---------------------------------------------------------------------- -# Copyright (c) 2011-2015 Raytheon BBN Technologies +# Copyright (c) 2011-2016 Raytheon BBN Technologies # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and/or hardware specification (the "Work") to diff --git a/src/gcf/omnilib/util/dossl.py b/src/gcf/omnilib/util/dossl.py index ec853ba5..e585425b 100644 --- a/src/gcf/omnilib/util/dossl.py +++ b/src/gcf/omnilib/util/dossl.py @@ -1,5 +1,5 @@ #---------------------------------------------------------------------- -# Copyright (c) 2011-2015 Raytheon BBN Technologies +# Copyright (c) 2011-2016 Raytheon BBN Technologies # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and/or hardware specification (the "Work") to diff --git a/src/gcf/omnilib/util/faultPrinting.py b/src/gcf/omnilib/util/faultPrinting.py index a1e6113f..c0da9248 100644 --- a/src/gcf/omnilib/util/faultPrinting.py +++ b/src/gcf/omnilib/util/faultPrinting.py @@ -1,5 +1,5 @@ #---------------------------------------------------------------------- -# Copyright (c) 2010-2015 Raytheon BBN Technologies +# Copyright (c) 2010-2016 Raytheon BBN Technologies # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and/or hardware specification (the "Work") to diff --git a/src/gcf/omnilib/util/files.py b/src/gcf/omnilib/util/files.py index 4fbca54b..9aeb53d1 100644 --- a/src/gcf/omnilib/util/files.py +++ b/src/gcf/omnilib/util/files.py @@ -1,5 +1,5 @@ #---------------------------------------------------------------------- -# Copyright (c) 2012-2015 Raytheon BBN Technologies +# Copyright (c) 2012-2016 Raytheon BBN Technologies # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and/or hardware specification (the "Work") to diff --git a/src/gcf/omnilib/util/handler_utils.py b/src/gcf/omnilib/util/handler_utils.py index a01ee8aa..d0e58992 100644 --- a/src/gcf/omnilib/util/handler_utils.py +++ b/src/gcf/omnilib/util/handler_utils.py @@ -1,5 +1,5 @@ #---------------------------------------------------------------------- -# Copyright (c) 2012-2015 Raytheon BBN Technologies +# Copyright (c) 2012-2016 Raytheon BBN Technologies # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and/or hardware specification (the "Work") to diff --git a/src/gcf/omnilib/util/json_encoding.py b/src/gcf/omnilib/util/json_encoding.py index 77068ebb..5452dfb8 100644 --- a/src/gcf/omnilib/util/json_encoding.py +++ b/src/gcf/omnilib/util/json_encoding.py @@ -1,7 +1,7 @@ #!/usr/bin/python #---------------------------------------------------------------------- -# Copyright (c) 2012-2015 Raytheon BBN Technologies +# Copyright (c) 2012-2016 Raytheon BBN Technologies # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and/or hardware specification (the "Work") to diff --git a/src/gcf/omnilib/util/namespace.py b/src/gcf/omnilib/util/namespace.py index 66b640ab..19b44986 100644 --- a/src/gcf/omnilib/util/namespace.py +++ b/src/gcf/omnilib/util/namespace.py @@ -1,5 +1,5 @@ #---------------------------------------------------------------------- -# Copyright (c) 2010-2015 Raytheon BBN Technologies +# Copyright (c) 2010-2016 Raytheon BBN Technologies # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and/or hardware specification (the "Work") to diff --git a/src/gcf/omnilib/util/omnierror.py b/src/gcf/omnilib/util/omnierror.py index beff008e..641ff3a0 100644 --- a/src/gcf/omnilib/util/omnierror.py +++ b/src/gcf/omnilib/util/omnierror.py @@ -1,5 +1,5 @@ #---------------------------------------------------------------------- -# Copyright (c) 2011-2015 Raytheon BBN Technologies +# Copyright (c) 2011-2016 Raytheon BBN Technologies # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and/or hardware specification (the "Work") to diff --git a/src/gcf/omnilib/util/paths.py b/src/gcf/omnilib/util/paths.py index 7c7a7f28..ce1fadc6 100644 --- a/src/gcf/omnilib/util/paths.py +++ b/src/gcf/omnilib/util/paths.py @@ -1,5 +1,5 @@ #---------------------------------------------------------------------- -# Copyright (c) 2010-2015 Raytheon BBN Technologies +# Copyright (c) 2010-2016 Raytheon BBN Technologies # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and/or hardware specification (the "Work") to diff --git a/src/gcf/omnilib/xmlrpc/client.py b/src/gcf/omnilib/xmlrpc/client.py index 9573fa01..5ea09aff 100644 --- a/src/gcf/omnilib/xmlrpc/client.py +++ b/src/gcf/omnilib/xmlrpc/client.py @@ -1,5 +1,5 @@ #---------------------------------------------------------------------- -# Copyright (c) 2011-2015 Raytheon BBN Technologies +# Copyright (c) 2011-2016 Raytheon BBN Technologies # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and/or hardware specification (the "Work") to diff --git a/src/gcf/oscript.py b/src/gcf/oscript.py index 179c4e66..e51232b9 100755 --- a/src/gcf/oscript.py +++ b/src/gcf/oscript.py @@ -1,7 +1,7 @@ #!/usr/bin/env python #---------------------------------------------------------------------- -# Copyright (c) 2011-2015 Raytheon BBN Technologies +# Copyright (c) 2011-2016 Raytheon BBN Technologies # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and/or hardware specification (the "Work") to @@ -996,7 +996,7 @@ def getSystemInfo(): def getOmniVersion(): version ="GENI Omni Command Line Aggregate Manager Tool Version %s" % GCF_VERSION - version +="\nCopyright (c) 2011-2015 Raytheon BBN Technologies" + version +="\nCopyright (c) 2011-2016 Raytheon BBN Technologies" return version def getParser(): diff --git a/src/gcf/sfa/trust/abac_credential.py b/src/gcf/sfa/trust/abac_credential.py index b7f68c51..d90b1321 100644 --- a/src/gcf/sfa/trust/abac_credential.py +++ b/src/gcf/sfa/trust/abac_credential.py @@ -1,5 +1,5 @@ #---------------------------------------------------------------------- -# Copyright (c) 2014-2015 Raytheon BBN Technologies +# Copyright (c) 2014-2016 Raytheon BBN Technologies # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and/or hardware specification (the "Work") to diff --git a/src/gcf/sfa/trust/credential_factory.py b/src/gcf/sfa/trust/credential_factory.py index 72a13a5f..1f30e42e 100644 --- a/src/gcf/sfa/trust/credential_factory.py +++ b/src/gcf/sfa/trust/credential_factory.py @@ -1,5 +1,5 @@ #---------------------------------------------------------------------- -# Copyright (c) 2014-2015 Raytheon BBN Technologies +# Copyright (c) 2014-2016 Raytheon BBN Technologies # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and/or hardware specification (the "Work") to diff --git a/src/gcf/stitcher_logging_deft.py b/src/gcf/stitcher_logging_deft.py index b3cdf1be..e6426e14 100644 --- a/src/gcf/stitcher_logging_deft.py +++ b/src/gcf/stitcher_logging_deft.py @@ -1,5 +1,5 @@ #---------------------------------------------------------------------- -# Copyright (c) 2014-2015 Raytheon BBN Technologies +# Copyright (c) 2014-2016 Raytheon BBN Technologies # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and/or hardware specification (the "Work") to diff --git a/src/gen-certs.py b/src/gen-certs.py index 933a803e..c8c74b04 100755 --- a/src/gen-certs.py +++ b/src/gen-certs.py @@ -1,7 +1,7 @@ #!/usr/bin/env python #---------------------------------------------------------------------- -# Copyright (c) 2011-2015 Raytheon BBN Technologies +# Copyright (c) 2011-2016 Raytheon BBN Technologies # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and/or hardware specification (the "Work") to diff --git a/src/omni-configure.py b/src/omni-configure.py index e811e48a..d1578472 100755 --- a/src/omni-configure.py +++ b/src/omni-configure.py @@ -1,7 +1,7 @@ #!/usr/bin/env python #---------------------------------------------------------------------- -# Copyright (c) 2011-2015 Raytheon BBN Technologies +# Copyright (c) 2011-2016 Raytheon BBN Technologies # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and/or hardware specification (the "Work") to diff --git a/src/omni.py b/src/omni.py index 4dc4091c..0ae4b472 100755 --- a/src/omni.py +++ b/src/omni.py @@ -1,6 +1,6 @@ #!/usr/bin/env python #---------------------------------------------------------------------- -# Copyright (c) 2011-2015 Raytheon BBN Technologies +# Copyright (c) 2011-2016 Raytheon BBN Technologies # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and/or hardware specification (the "Work") to diff --git a/src/omni_unittest.py b/src/omni_unittest.py index 68b7d985..f41314fb 100755 --- a/src/omni_unittest.py +++ b/src/omni_unittest.py @@ -1,7 +1,7 @@ #!/usr/bin/env python #---------------------------------------------------------------------- -# Copyright (c) 2011-2015 Raytheon BBN Technologies +# Copyright (c) 2011-2016 Raytheon BBN Technologies # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and/or hardware specification (the "Work") to diff --git a/src/stitcher.py b/src/stitcher.py index 27f6d2d7..8ca57172 100755 --- a/src/stitcher.py +++ b/src/stitcher.py @@ -1,7 +1,7 @@ #!/usr/bin/env python #---------------------------------------------------------------------- -# Copyright (c) 2013-2015 Raytheon BBN Technologies +# Copyright (c) 2013-2016 Raytheon BBN Technologies # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and/or hardware specification (the "Work") to @@ -96,7 +96,7 @@ def call(argv, options=None): parser = omni.getParser() # update usage for help message omni_usage = parser.get_usage() - parser.set_usage("\n" + "GENI Omni Stitching Tool\n" + "Copyright (c) 2013-2015 Raytheon BBN Technologies\n" + + parser.set_usage("\n" + "GENI Omni Stitching Tool\n" + "Copyright (c) 2013-2016 Raytheon BBN Technologies\n" + omni_usage+ "\nstitcher.py reserves multi-aggregate fully bound topologies, including stitching, if the call is createsliver or allocate; else it just calls Omni.\n") diff --git a/windows_install/LICENSE.TXT b/windows_install/LICENSE.TXT index 2e88c62d..e2194419 100644 --- a/windows_install/LICENSE.TXT +++ b/windows_install/LICENSE.TXT @@ -2,7 +2,7 @@ Raytheon BBN Technologies grants you the following GENI Public License to the Omni experimenter tool executables for Microsoft Windows and Mac OS: -Copyright (c) 2010-2015 Raytheon BBN Technologies +Copyright (c) 2010-2016 Raytheon BBN Technologies Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation (the "Work") to diff --git a/windows_install/package_builder.iss b/windows_install/package_builder.iss index 930f45ad..38102edb 100644 --- a/windows_install/package_builder.iss +++ b/windows_install/package_builder.iss @@ -1,7 +1,7 @@ [Setup] OutputDir=C:\Users\local_user\gcf\executables OutputBaseFilename=omniTools-2.11-win-setup -AppCopyright=2010-2015 +AppCopyright=2010-2016 AppName=omniTools-2.11 AppVerName=omniTools-2.11 InfoAfterFile=C:\Users\local_user\gcf\windows_install\infoAfterFile.rtf @@ -23,8 +23,8 @@ Source: ..\README-omni.txt; DestDir: {app} Source: ..\README-omniconfigure.txt; DestDir: {app} Source: ..\README-stitching.txt; DestDir: {app} Source: ..\README-clearpassphrases.txt; DestDir: {app} -Source: ..\CONTRIBUTORS.md; DestDir: {app} -Source: ..\CONTRIBUTING.md; DestDir: {app} +Source: ..\CONTRIBUTORS.md; DestDir: {app} +Source: ..\CONTRIBUTING.md; DestDir: {app} Source: ..\src\dist\_hashlib.pyd; DestDir: {app} Source: ..\src\dist\_socket.pyd; DestDir: {app} Source: ..\src\dist\_ssl.pyd; DestDir: {app} diff --git a/windows_install/setup.py b/windows_install/setup.py index 5aed0636..35e3956a 100644 --- a/windows_install/setup.py +++ b/windows_install/setup.py @@ -1,5 +1,5 @@ #---------------------------------------------------------------------- -# Copyright (c) 2013-2015 Raytheon BBN Technologies +# Copyright (c) 2013-2016 Raytheon BBN Technologies # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and/or hardware specification (the "Work") to