def test_parser(self): args = parse_args(['fittings.yaml', 'build', 'web']) self.assertEqual(args.fittings, 'fittings.yaml') self.assertEqual(args.action, 'build') self.assertEqual(args.blueprints, ['web']) self.assertEqual(args.facilities, None) args = parse_args( ['fittings.yaml', 'build', 'web', '-p', 'parameters.yaml']) self.assertEqual(args.parameters, ['parameters.yaml']) args = parse_args( ['fittings.yaml', 'build', 'web', '-p', 'parameters.yaml', '-s']) self.assertEqual(args.parameters, ['parameters.yaml']) self.assertEqual(args.safe, True) args = parse_args( ['fittings.yaml', 'build', 'web', '-p', 'parameters.yaml', '-d']) self.assertEqual(args.parameters, ['parameters.yaml']) self.assertEqual(args.debug, True) args = parse_args(['fittings.yaml', 'build', 'web', '-s']) self.assertEqual(args.safe, True) args = parse_args(['fittings.yaml', 'build', 'web', '-d']) self.assertEqual(args.debug, True) self.assertEqual( plogging.getEffectiveLevel(), logging.DEBUG) args = parse_args(['fittings.yaml', 'build', 'web', '-q']) self.assertEqual(args.quiet, True) self.assertEqual( plogging.getEffectiveLevel(), logging.WARNING) args = parse_args(['fittings.yaml', 'start', '@NA12']) self.assertEqual(args.fittings, 'fittings.yaml') self.assertEqual(args.action, 'start') self.assertEqual(args.blueprints, None) self.assertEqual(args.facilities, ['NA12']) args = parse_args([ 'fittings.yaml', 'prepare', 'web', 'sql', '@NA9', '@NA12']) self.assertEqual(args.fittings, 'fittings.yaml') self.assertEqual(args.action, 'prepare') self.assertEqual(args.blueprints, ['web', 'sql']) self.assertEqual(args.facilities, ['NA9', 'NA12']) args = parse_args([ 'fittings.yaml', 'prepare', 'web', '@NA9', 'sql', '@NA12']) self.assertEqual(args.fittings, 'fittings.yaml') self.assertEqual(args.action, 'prepare') self.assertEqual(args.blueprints, ['web', 'sql']) self.assertEqual(args.facilities, ['NA9', 'NA12']) args = parse_args(['fittings.yaml', 'polish']) self.assertEqual(args.fittings, 'fittings.yaml') self.assertEqual(args.action, 'polish') self.assertEqual(args.blueprints, None) self.assertEqual(args.facilities, None)
def test_parser(self): args = parse_args(['fittings.yaml', 'build', 'web']) self.assertEqual(args.fittings, 'fittings.yaml') self.assertEqual(args.action, 'build') self.assertEqual(args.blueprints, ['web']) self.assertEqual(args.facilities, None) args = parse_args( ['fittings.yaml', 'build', 'web', '-p', 'parameters.yaml']) self.assertEqual(args.parameters, ['parameters.yaml']) args = parse_args( ['fittings.yaml', 'build', 'web', '-p', 'parameters.yaml', '-s']) self.assertEqual(args.parameters, ['parameters.yaml']) self.assertEqual(args.safe, True) args = parse_args( ['fittings.yaml', 'build', 'web', '-p', 'parameters.yaml', '-d']) self.assertEqual(args.parameters, ['parameters.yaml']) self.assertEqual(args.debug, True) args = parse_args(['fittings.yaml', 'build', 'web', '-s']) self.assertEqual(args.safe, True) args = parse_args(['fittings.yaml', 'build', 'web', '-d']) self.assertEqual(args.debug, True) self.assertEqual(plogging.getEffectiveLevel(), logging.DEBUG) args = parse_args(['fittings.yaml', 'build', 'web', '-q']) self.assertEqual(args.quiet, True) self.assertEqual(plogging.getEffectiveLevel(), logging.WARNING) args = parse_args(['fittings.yaml', 'start', '@NA12']) self.assertEqual(args.fittings, 'fittings.yaml') self.assertEqual(args.action, 'start') self.assertEqual(args.blueprints, None) self.assertEqual(args.facilities, ['NA12']) args = parse_args( ['fittings.yaml', 'prepare', 'web', 'sql', '@NA9', '@NA12']) self.assertEqual(args.fittings, 'fittings.yaml') self.assertEqual(args.action, 'prepare') self.assertEqual(args.blueprints, ['web', 'sql']) self.assertEqual(args.facilities, ['NA9', 'NA12']) args = parse_args( ['fittings.yaml', 'prepare', 'web', '@NA9', 'sql', '@NA12']) self.assertEqual(args.fittings, 'fittings.yaml') self.assertEqual(args.action, 'prepare') self.assertEqual(args.blueprints, ['web', 'sql']) self.assertEqual(args.facilities, ['NA9', 'NA12']) args = parse_args(['fittings.yaml', 'polish']) self.assertEqual(args.fittings, 'fittings.yaml') self.assertEqual(args.action, 'polish') self.assertEqual(args.blueprints, None) self.assertEqual(args.facilities, None)
def test_direct(self): plogging.setLevel(logging.DEBUG) self.assertEqual(plogging.getEffectiveLevel(), logging.DEBUG) plogging.debug("hello world -- debug") plogging.info("hello world -- info") plogging.warning("hello world -- warning") plogging.error("hello world -- error") plogging.critical("hello world -- critical") self.assertEqual(plogging.foundErrors(), True) plogging.reset() self.assertEqual(plogging.foundErrors(), False)
def test_direct(self): class DullHandler(logging.NullHandler): level = logging.DEBUG def emit(self, record): log_entry = self.format(record) plogging.addHandler(DullHandler()) plogging.setLevel(logging.DEBUG) self.assertEqual(plogging.getEffectiveLevel(), logging.DEBUG) plogging.debug("hello world -- debug") plogging.info("hello world -- info") plogging.warning("hello world -- warning") plogging.error("hello world -- error") plogging.critical("hello world -- critical") self.assertEqual(plogging.foundErrors(), True) plogging.reset() self.assertEqual(plogging.foundErrors(), False)
def main(args=None, engine=None): """ Runs plumbery from the command line :param args: arguments to be considered for this invocation :type args: a list of ``str`` :param engine: an instance of the plumbery engine :type engine: :class:`plumbery.PlumberEngine` Example:: $ python -m plumbery fittings.yaml build web In this example, plumbery loads fittings plan from ``fittings.yaml``, then it builds the blueprint named ``web``. If no blueprint is mentioned, then plumbery looks at all blueprint definitions in the fittings plan. In other terms, the following command builds the entire fittings plan, eventually across multiple facilities:: $ python -m plumbery fittings.yaml build Of course, plumbery can be invoked through the entire life cycle of your fittings:: $ python -m plumbery fittings.yaml build $ python -m plumbery fittings.yaml start $ python -m plumbery fittings.yaml polish ... nodes are up and running ... $ python -m plumbery fittings.yaml stop ... nodes have been stopped ... $ python -m plumbery fittings.yaml wipe ... nodes have been destroyed, but the infrastructure remains ... $ python -m plumbery fittings.yaml destroy ... every virtual resources has been removed ... To focus at a single location, put the character '@' followed by the id. For example, to build fittings only at 'NA12' you would type:: $ python -m plumbery fittings.yaml build @NA12 To focus on one blueprint just mention its name on the command line. For example, if fittings plan has a blueprint for nodes running Docker, then you may use following statements to bootstrap each node:: $ python -m plumbery fittings.yaml build docker $ python -m plumbery fittings.yaml start docker $ python -m plumbery fittings.yaml prepare docker ... Docker is up and running at multiple nodes ... If you create a new polisher and put it in the directory ``plumbery\polishers``, then it will become automatically available:: $ python -m plumbery fittings.yaml my_special_stuff To get some help, you can type:: $ python -m plumbery -h """ # part 1 - understand what the user wants if args is None: args = sys.argv[1:] try: args = parse_args(args) except Exception as feedback: plogging.error("Incorrect arguments. " "Maybe the following can help: python -m plumbery -h") if plogging.getEffectiveLevel() == logging.DEBUG: raise else: plogging.error("{}: {}".format(feedback.__class__.__name__, str(feedback))) sys.exit(2) # part 2 - get a valid and configured engine if engine is None: try: engine = PlumberyEngine(args.fittings, args.parameters) if args.safe: engine.safeMode = True except Exception as feedback: if plogging.getEffectiveLevel() == logging.DEBUG: plogging.error("Cannot read fittings plan from '{}'".format( args.fittings)) raise else: plogging.error("Cannot read fittings plan from '{}'" ", run with -d for debug".format(args.fittings)) plogging.error("{}: {}".format(feedback.__class__.__name__, str(feedback))) sys.exit(2) # part 3 - do the job try: engine.do(args.action, args.blueprints, args.facilities) plogging.info(engine.document_elapsed()) except Exception as feedback: if plogging.getEffectiveLevel() == logging.DEBUG: plogging.error("Unable to do '{}'".format(args.action)) raise else: plogging.error("Unable to do '{}', run with -d for debug".format( args.action)) plogging.error("{}: {}".format(feedback.__class__.__name__, str(feedback))) sys.exit(1)
def main(args=None, engine=None): """ Runs plumbery from the command line :param args: arguments to be considered for this invocation :type args: a list of ``str`` :param engine: an instance of the plumbery engine :type engine: :class:`plumbery.PlumberEngine` Example:: $ python -m plumbery fittings.yaml build web In this example, plumbery loads fittings plan from ``fittings.yaml``, then it builds the blueprint named ``web``. If no blueprint is mentioned, then plumbery looks at all blueprint definitions in the fittings plan. In other terms, the following command builds the entire fittings plan, eventually across multiple facilities:: $ python -m plumbery fittings.yaml build Of course, plumbery can be invoked through the entire life cycle of your fittings:: $ python -m plumbery fittings.yaml build $ python -m plumbery fittings.yaml start $ python -m plumbery fittings.yaml polish ... nodes are up and running ... $ python -m plumbery fittings.yaml stop ... nodes have been stopped ... $ python -m plumbery fittings.yaml wipe ... nodes have been destroyed, but the infrastructure remains ... $ python -m plumbery fittings.yaml destroy ... every virtual resources has been removed ... To focus at a single location, put the character '@' followed by the id. For example, to build fittings only at 'NA12' you would type:: $ python -m plumbery fittings.yaml build @NA12 To focus on one blueprint just mention its name on the command line. For example, if fittings plan has a blueprint for nodes running Docker, then you may use following statements to bootstrap each node:: $ python -m plumbery fittings.yaml build docker $ python -m plumbery fittings.yaml start docker $ python -m plumbery fittings.yaml prepare docker ... Docker is up and running at multiple nodes ... If you create a new polisher and put it in the directory ``plumbery\polishers``, then it will become automatically available:: $ python -m plumbery fittings.yaml my_special_stuff To get some help, you can type:: $ python -m plumbery -h """ # part 1 - understand what the user wants if args is None: args = sys.argv[1:] try: args = parse_args(args) except Exception as feedback: plogging.error("Incorrect arguments. " "Maybe the following can help: python -m plumbery -h") if plogging.getEffectiveLevel() == logging.DEBUG: raise else: plogging.error("{}: {}".format( feedback.__class__.__name__, str(feedback))) sys.exit(2) # part 2 - get a valid and configured engine if engine is None: try: engine = PlumberyEngine(args.fittings, args.parameters) if args.safe: engine.safeMode = True except Exception as feedback: if plogging.getEffectiveLevel() == logging.DEBUG: plogging.error("Cannot read fittings plan from '{}'".format( args.fittings)) raise else: plogging.error("Cannot read fittings plan from '{}'" ", run with -d for debug".format( args.fittings)) plogging.error("{}: {}".format( feedback.__class__.__name__, str(feedback))) sys.exit(2) # part 3 - do the job try: engine.do(args.action, args.blueprints, args.facilities) plogging.info(engine.document_elapsed()) except Exception as feedback: if plogging.getEffectiveLevel() == logging.DEBUG: plogging.error("Unable to do '{}'".format(args.action)) raise else: plogging.error("Unable to do '{}', run with -d for debug".format( args.action)) plogging.error("{}: {}".format( feedback.__class__.__name__, str(feedback))) sys.exit(1)