Esempio n. 1
0
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))
Esempio n. 2
0
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))
Esempio n. 3
0
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))
Esempio n. 4
0
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()
Esempio n. 6
0
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()
Esempio n. 7
0
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))