def main(): """Authenticate, and download file from MAAS metadata API.""" import argparse parser = argparse.ArgumentParser( description="GET file from MAAS metadata API.") parser.add_argument( "--config", metavar="file", help="Config file containing MAAS API credentials", default=None) parser.add_argument("--apiver", metavar="version", help="Use given API version", default=MD_VERSION) parser.add_argument('path') args = parser.parse_args() creds = { 'consumer_key': None, 'token_key': None, 'token_secret': None, 'consumer_secret': '', 'metadata_url': None, } read_config(args.config, creds) url = "%s/%s/%s" % ( creds['metadata_url'], args.apiver, args.path, ) sys.stdout.write(geturl(url, creds))
def main(): """Authenticate, and download file from MAAS metadata API.""" import argparse parser = argparse.ArgumentParser( description="GET file from MAAS metadata API.") parser.add_argument("--config", metavar="file", help="Config file containing MAAS API credentials", default=None) parser.add_argument("--apiver", metavar="version", help="Use given API version", default=MD_VERSION) parser.add_argument('path') args = parser.parse_args() creds = { 'consumer_key': None, 'token_key': None, 'token_secret': None, 'consumer_secret': '', 'metadata_url': None, } read_config(args.config, creds) url = "%s/%s/%s" % ( creds['metadata_url'], args.apiver, args.path, ) sys.stdout.write(geturl(url, creds))
def main(): """ Call with single argument of directory or http or https url. If url is given additional arguments are allowed, which will be interpreted as consumer_key, token_key, token_secret, consumer_secret. """ import argparse parser = argparse.ArgumentParser( description='Send signal operation and optionally post files to MAAS') parser.add_argument( "--config", metavar="file", help="Specify config file", default=None) parser.add_argument( "--ckey", metavar="key", help="The consumer key to auth with", default=None) parser.add_argument( "--tkey", metavar="key", help="The token key to auth with", default=None) parser.add_argument( "--csec", metavar="secret", help="The consumer secret (likely '')", default="") parser.add_argument( "--tsec", metavar="secret", help="The token secret to auth with", default=None) parser.add_argument( "--apiver", metavar="version", help="The apiver to use (\"\" can be used)", default=MD_VERSION) parser.add_argument( "--url", metavar="url", help="The data source to query", default=None) parser.add_argument( "--file", dest='files', help="File to post", action='append', default=[]) parser.add_argument( "--post", dest='posts', help="name=value pairs to post", action='append', default=[]) parser.add_argument( "--power-type", dest='power_type', help="Power type.", choices=POWER_TYPES, default=None) parser.add_argument( "--power-parameters", dest='power_parms', help="Power parameters.", default=None) parser.add_argument( "--script-result", metavar="retval", type=int, dest='script_result', help="Return code of a commissioning script.") parser.add_argument( "status", help="Status", choices=VALID_STATUS, action='store') parser.add_argument( "message", help="Optional message", default="", nargs='?') args = parser.parse_args() creds = { 'consumer_key': args.ckey, 'token_key': args.tkey, 'token_secret': args.tsec, 'consumer_secret': args.csec, 'metadata_url': args.url, } if args.config: read_config(args.config, creds) url = creds.get('metadata_url', None) if not url: fail("URL must be provided either in --url or in config\n") url = "%s/%s/" % (url, args.apiver) params = { "op": "signal", "status": args.status, "error": args.message, } if args.script_result is not None: params['script_result'] = args.script_result for ent in args.posts: try: (key, val) = ent.split("=", 2) except ValueError: sys.stderr.write("'%s' had no '='" % ent) sys.exit(1) params[key] = val if args.power_parms is not None: params["power_type"] = args.power_type if params["power_type"] == "moonshot": user, passwd, address, hwaddress = args.power_parms.split(",") power_parms = dict( power_user=user, power_pass=passwd, power_address=address, power_hwaddress=hwaddress ) else: user, passwd, address, driver = args.power_parms.split(",") power_parms = dict( power_user=user, power_pass=passwd, power_address=address, power_driver=driver ) params["power_parameters"] = json.dumps(power_parms) files = {} for fpath in args.files: files[os.path.basename(fpath)] = open(fpath, "r") data, headers = encode_multipart_data(params, files) exc = None msg = "" try: payload = geturl(url, creds=creds, headers=headers, data=data) if payload != "OK": raise TypeError("Unexpected result from call: %s" % payload) else: msg = "Success" except urllib2.HTTPError as exc: msg = "http error [%s]" % exc.code except urllib2.URLError as exc: msg = "url error [%s]" % exc.reason except socket.timeout as exc: msg = "socket timeout [%s]" % exc except TypeError as exc: msg = exc.message except Exception as exc: msg = "unexpected error [%s]" % exc sys.stderr.write("%s\n" % msg) sys.exit((exc is None))
def main(): import argparse parser = argparse.ArgumentParser( description="Send signal operation and optionally post files to MAAS" ) parser.add_argument( "--config", metavar="file", help="Specify config file", default=None ) parser.add_argument( "--ckey", metavar="key", help="The consumer key to auth with", default=None, ) parser.add_argument( "--tkey", metavar="key", help="The token key to auth with", default=None, ) parser.add_argument( "--csec", metavar="secret", help="The consumer secret (likely '')", default="", ) parser.add_argument( "--tsec", metavar="secret", help="The token secret to auth with", default=None, ) parser.add_argument( "--apiver", metavar="version", help='The apiver to use ("" can be used)', default=MD_VERSION, ) parser.add_argument( "--url", metavar="url", help="The data source to query", default=None ) parser.add_argument( "--script-name", metavar="script_name", type=str, dest="script_name", help="The name of the Script this signal is about.", ) parser.add_argument( "--script-result-id", metavar="script_result_id", type=int, dest="script_result_id", help="The ScriptResult database id this signal is about.", ) parser.add_argument( "--file", dest="files", help="File to post", action="append", default=[], ) parser.add_argument( "--runtime", metavar="runtime", type=float, dest="runtime", help="How long the script took to run.", ) parser.add_argument( "--exit-status", metavar="exit_status", type=int, dest="exit_status", help="The exit return code of the script this signal is about.", ) parser.add_argument( "--script-version-id", metavar="script_version_id", type=int, dest="script_version_id", help="The Script VersionTextFile database id this signal is about.", ) parser.add_argument( "--power-type", dest="power_type", help="Power type.", choices=POWER_TYPES, default=None, ) parser.add_argument( "--power-parameters", dest="power_params", help="Power parameters.", default=None, ) parser.add_argument("status", help="Status", choices=VALID_STATUS) parser.add_argument( "error", help="Optional error message", nargs="?", default=None ) args = parser.parse_args() creds = { "consumer_key": args.ckey, "token_key": args.tkey, "token_secret": args.tsec, "consumer_secret": args.csec, "metadata_url": args.url, } if args.config: read_config(args.config, creds) url = creds.get("metadata_url") if url is None: fail("URL must be provided either in --url or in config\n") url = "%s/%s/" % (url, args.apiver) files = {} for fpath in args.files: files[os.path.basename(fpath)] = open(fpath, "rb") try: signal( url, creds, args.status, args.error, args.script_name, args.script_result_id, files, args.runtime, args.exit_status, args.script_version_id, args.power_type, args.power_params, ) except SignalException as e: fail(e.error)
def main(): import argparse parser = argparse.ArgumentParser( description='Download and run scripts from the MAAS metadata service.') parser.add_argument("--config", metavar="file", help="Specify config file", default=None) parser.add_argument("--ckey", metavar="key", help="The consumer key to auth with", default=None) parser.add_argument("--tkey", metavar="key", help="The token key to auth with", default=None) parser.add_argument("--csec", metavar="secret", help="The consumer secret (likely '')", default="") parser.add_argument("--tsec", metavar="secret", help="The token secret to auth with", default=None) parser.add_argument("--apiver", metavar="version", help="The apiver to use (\"\" can be used)", default=MD_VERSION) parser.add_argument("--url", metavar="url", help="The data source to query", default=None) parser.add_argument( "storage_directory", help="Directory to store the extracted data from the metadata service." ) args = parser.parse_args() creds = { 'consumer_key': args.ckey, 'token_key': args.tkey, 'token_secret': args.tsec, 'consumer_secret': args.csec, 'metadata_url': args.url, } if args.config: read_config(args.config, creds) url = creds.get('metadata_url') if url is None: fail("URL must be provided either in --url or in config\n") url = "%s/%s/" % (url, args.apiver) # Disable the OOM killer on the runner process, the OOM killer will still # go after any tests spawned. oom_score_adj_path = os.path.join('/proc', str(os.getpid()), 'oom_score_adj') open(oom_score_adj_path, 'w').write('-1000') # Give the runner the highest nice value to ensure the heartbeat keeps # running. os.nice(-20) heart_beat = HeartBeat(url, creds) heart_beat.start() scripts_dir = os.path.join(args.storage_directory, 'scripts') os.makedirs(scripts_dir) out_dir = os.path.join(args.storage_directory, 'out') os.makedirs(out_dir) download_and_extract_tar("%s/maas-scripts/" % url, creds, scripts_dir) run_scripts_from_metadata(url, creds, scripts_dir, out_dir) heart_beat.stop()
def main(): parser = argparse.ArgumentParser( description="Download and run scripts from the MAAS metadata service.") parser.add_argument( "--config", metavar="file", help="Specify config file", default="/etc/cloud/cloud.cfg.d/91_kernel_cmdline_url.cfg", ) parser.add_argument( "--ckey", metavar="key", help="The consumer key to auth with", default=None, ) parser.add_argument( "--tkey", metavar="key", help="The token key to auth with", default=None, ) parser.add_argument( "--csec", metavar="secret", help="The consumer secret (likely '')", default="", ) parser.add_argument( "--tsec", metavar="secret", help="The token secret to auth with", default=None, ) parser.add_argument( "--apiver", metavar="version", help='The apiver to use ("" can be used)', default=MD_VERSION, ) parser.add_argument("--url", metavar="url", help="The data source to query", default=None) parser.add_argument( "--no-send", action="store_true", default=False, help="Don't send results back to MAAS", ) parser.add_argument( "--no-download", action="store_true", default=False, help="Assume scripts have already been downloaded", ) parser.add_argument( "storage_directory", nargs="?", default=os.path.abspath(os.path.join(os.path.dirname(__file__), "..")), help="Directory to store the extracted data from the metadata service.", ) args = parser.parse_args() creds = { "consumer_key": args.ckey, "token_key": args.tkey, "token_secret": args.tsec, "consumer_secret": args.csec, "metadata_url": args.url, } if args.config: read_config(args.config, creds) url = creds.get("metadata_url") if url is None: fail("URL must be provided either in --url or in config\n") if url.endswith("/"): url = url[:-1] url = "%s/%s/" % (url, args.apiver) # Disable the OOM killer on the runner process, the OOM killer will still # go after any tests spawned. oom_score_adj_path = os.path.join("/proc", str(os.getpid()), "oom_score_adj") open(oom_score_adj_path, "w").write("-1000") # Give the runner the highest nice value to ensure the heartbeat keeps # running. os.nice(-20) # Make sure installing packages is noninteractive for this process # and all subprocesses. if "DEBIAN_FRONTEND" not in os.environ: os.environ["DEBIAN_FRONTEND"] = "noninteractive" heart_beat = HeartBeat(url, creds) if not args.no_send: heart_beat.start() scripts_dir = os.path.join(args.storage_directory, "scripts") os.makedirs(scripts_dir, exist_ok=True) out_dir = os.path.join(args.storage_directory, "out") os.makedirs(out_dir, exist_ok=True) has_content = True fail_count = 0 if not args.no_download: has_content = download_and_extract_tar("%smaas-scripts" % url, creds, scripts_dir) if has_content: fail_count = run_scripts_from_metadata( url, creds, scripts_dir, out_dir, not args.no_send, not args.no_download, ) # Signal success or failure after all scripts have ran. This tells the # region to transistion the status. if fail_count == 0: output_and_send("All scripts successfully ran", not args.no_send, url, creds, "OK") else: output_and_send( "%d test scripts failed to run" % fail_count, not args.no_send, url, creds, "FAILED", ) heart_beat.stop()
def main(): """ Call with single argument of directory or http or https url. If url is given additional arguments are allowed, which will be interpreted as consumer_key, token_key, token_secret, consumer_secret. """ import argparse parser = argparse.ArgumentParser( description='Send signal operation and optionally post files to MAAS') parser.add_argument("--config", metavar="file", help="Specify config file", default=None) parser.add_argument("--ckey", metavar="key", help="The consumer key to auth with", default=None) parser.add_argument("--tkey", metavar="key", help="The token key to auth with", default=None) parser.add_argument("--csec", metavar="secret", help="The consumer secret (likely '')", default="") parser.add_argument("--tsec", metavar="secret", help="The token secret to auth with", default=None) parser.add_argument("--apiver", metavar="version", help="The apiver to use (\"\" can be used)", default=MD_VERSION) parser.add_argument("--url", metavar="url", help="The data source to query", default=None) parser.add_argument("--file", dest='files', help="File to post", action='append', default=[]) parser.add_argument("--post", dest='posts', help="name=value pairs to post", action='append', default=[]) parser.add_argument("--power-type", dest='power_type', help="Power type.", choices=POWER_TYPES, default=None) parser.add_argument("--power-parameters", dest='power_parms', help="Power parameters.", default=None) parser.add_argument("--script-result", metavar="retval", type=int, dest='script_result', help="Return code of a commissioning script.") parser.add_argument("status", help="Status", choices=VALID_STATUS, action='store') parser.add_argument("message", help="Optional message", default="", nargs='?') args = parser.parse_args() creds = { 'consumer_key': args.ckey, 'token_key': args.tkey, 'token_secret': args.tsec, 'consumer_secret': args.csec, 'metadata_url': args.url, } if args.config: read_config(args.config, creds) url = creds.get('metadata_url', None) if not url: fail("URL must be provided either in --url or in config\n") url = "%s/%s/" % (url, args.apiver) params = { "op": "signal", "status": args.status, "error": args.message, } if args.script_result is not None: params['script_result'] = args.script_result for ent in args.posts: try: (key, val) = ent.split("=", 2) except ValueError: sys.stderr.write("'%s' had no '='" % ent) sys.exit(1) params[key] = val if args.power_parms is not None: params["power_type"] = args.power_type if params["power_type"] == "moonshot": user, passwd, address, hwaddress = args.power_parms.split(",") power_parms = dict(power_user=user, power_pass=passwd, power_address=address, power_hwaddress=hwaddress) else: user, passwd, address, driver = args.power_parms.split(",") power_parms = dict(power_user=user, power_pass=passwd, power_address=address, power_driver=driver) params["power_parameters"] = json.dumps(power_parms) files = {} for fpath in args.files: files[os.path.basename(fpath)] = open(fpath, "r") data, headers = encode_multipart_data(params, files) exc = None msg = "" try: payload = geturl(url, creds=creds, headers=headers, data=data) if payload != "OK": raise TypeError("Unexpected result from call: %s" % payload) else: msg = "Success" except urllib2.HTTPError as exc: msg = "http error [%s]" % exc.code except urllib2.URLError as exc: msg = "url error [%s]" % exc.reason except socket.timeout as exc: msg = "socket timeout [%s]" % exc except TypeError as exc: msg = exc.message except Exception as exc: msg = "unexpected error [%s]" % exc sys.stderr.write("%s\n" % msg) sys.exit((exc is None))