Beispiel #1
0
def main(args=None):
    """Main script entry point function.

    Parses command line arguments and configuration file and loops through
    the deployment targets and performs the deployment task at hand on each
    requested target.

    """
    ap = argparse.ArgumentParser(description=__doc__.splitlines()[0])
    ap.add_argument('-v',
                    '--verbose',
                    action="store_true",
                    help="Enable verbose output")
    ap.add_argument(
        '-c',
        '--config',
        default="undeploy.conf",
        help="Deployment configuration settings file (default: %(default)s)")
    ap.add_argument('targets',
                    nargs="*",
                    help="Deployment targets (default: all)")

    args = ap.parse_args(args if args is not None else sys.argv[1:])

    if args.verbose:
        loglevel = logging.DEBUG
    else:
        loglevel = logging.INFO

    logging.basicConfig(level=loglevel)

    config = read_ini_config(args.config)
    log.debug("Deployment configuration:\n%s", config)

    targets = (args.targets
               if args.targets else [k for k in config if k != 'zato'])
    log.debug("Deployment targets: %s", ", ".join(targets))

    config.verbose = args.verbose

    if not targets:
        msg = "No deployment targets defined in deployment configuration."
        log.error(msg)
        return msg

    for target in targets:
        if target not in config:
            msg = ("Deployment target '{}' not defined in deployment "
                   "configuration.".format(target))
            log.error(msg)
            return msg

        existing_services = get_service_list(config[target])
        log.debug("Existing (non-internal) services on zato cluster: %s",
                  ", ".join(srv.name for srv in existing_services))

        patterns = [
            ptn.strip()
            for ptn in config[target].get('services', '').split(',')
            if ptn.strip()
        ]

        log.debug("Service patterns for target '{}': {}".format(
            target, ", ".join(patterns)))

        target_services = set()
        for service in existing_services:
            for ptn in patterns:
                if fnmatch.fnmatch(service.name, ptn):
                    target_services.add((service.name, service.id))

        log.debug("Services matching patterns for target '{}': {}".format(
            target, ", ".join(srv[0] for srv in target_services)))

        config[target].setdefault('verbose', args.verbose)

        if target_services:
            for name, id_ in target_services:
                delete_service(config[target], id_)
        else:
            log.info("No services to delete for target '{}'.".format(target))
def main(args=None):
    """Main script entry point function.

    Parses command line arguments and configuration file and loops through
    the deployment targets and performs the deployment task at hand on each
    requested target.

    """
    ap = argparse.ArgumentParser(description=__doc__.splitlines()[0])
    ap.add_argument('-v', '--verbose', action="store_true",
        help="Enable verbose output")
    ap.add_argument('-c', '--config', default="undeploy.conf",
        help="Deployment configuration settings file (default: %(default)s)")
    ap.add_argument('targets', nargs="*",
        help="Deployment targets (default: all)")

    args = ap.parse_args(args if args is not None else sys.argv[1:])

    if args.verbose:
        loglevel = logging.DEBUG
    else:
        loglevel = logging.INFO

    logging.basicConfig(level=loglevel)

    config = read_ini_config(args.config)
    log.debug("Deployment configuration:\n%s", config)

    targets = (args.targets if args.targets
               else [k for k in config if k != 'zato'])
    log.debug("Deployment targets: %s", ", ".join(targets))

    config.verbose = args.verbose

    if not targets:
        msg = "No deployment targets defined in deployment configuration."
        log.error(msg)
        return msg

    for target in targets:
        if target not in config:
            msg = ("Deployment target '{}' not defined in deployment "
                   "configuration.".format(target))
            log.error(msg)
            return msg

        existing_services = get_service_list(config[target])
        log.debug("Existing (non-internal) services on zato cluster: %s",
                  ", ".join(srv.name for srv in existing_services))

        patterns = [ptn.strip()
            for ptn in config[target].get('services', '').split(',')
                if ptn.strip()]

        log.debug("Service patterns for target '{}': {}".format(
            target, ", ".join(patterns)))

        target_services = set()
        for service in existing_services:
            for ptn in patterns:
                if fnmatch.fnmatch(service.name, ptn):
                    target_services.add((service.name, service.id))

        log.debug("Services matching patterns for target '{}': {}".format(
            target, ", ".join(srv[0] for srv in target_services)))

        config[target].setdefault('verbose', args.verbose)

        if target_services:
            for name, id_ in target_services:
                delete_service(config[target], id_)
        else:
            log.info("No services to delete for target '{}'.".format(target))
def main(args=None):
    """Main script entry point function.

    Parses command line arguments and configuration file and loops through
    the deployment targets and performs the deployment task at hand on each
    requested target.

    """
    ap = argparse.ArgumentParser(description=__doc__.splitlines()[0])
    ap.add_argument('-v', '--verbose', action="store_true",
        help="Enable verbose output")
    ap.add_argument('-c', '--config', default="deploy.conf",
        help="Deployment configuration settings file (default: %(default)s)")
    ap.add_argument('target', nargs="*",
        help="Deployment target(s) (default: all)")

    args = ap.parse_args(args if args is not None else sys.argv[1:])

    if args.verbose:
        loglevel = logging.DEBUG
    else:
        loglevel = logging.INFO

    logging.basicConfig(level=loglevel)

    config = read_ini_config(args.config)
    log.debug("Deployment configuration:\n%s", config)
    targets = (args.target if args.target
               else [k for k in config if k != 'zato'])
    log.debug("Deployment targets: %s", ", ".join(targets))
    config.verbose = args.verbose

    if not targets:
        msg = "No deployment targets defined in deployment configuration."
        log.error(msg)
        return msg

    for target in targets:
        if target not in config:
            msg = ("Deployment target '{}' not defined in deployment "
                   "configuration.".format(target))
            log.error(msg)
            return msg

        target_services = []
        for srv in config[target].get('modules', '').split(','):
            srv = srv.strip()

            if not srv:
                continue

            target_services.extend(glob.glob(srv))

        log.debug("Service modules to deploy to target '{}': {}".format(
            target, ", ".join(target_services)))

        config[target].setdefault('verbose', args.verbose)

        if target_services:
            for module in target_services:
                if exists(module):
                    upload_service(config[target], module)
                else:
                    msg = ("Service module file '{}' not found. "
                           "Aborting.".format(module))
                    log.error(msg)
                    return msg
        else:
            log.info(
                "No service modules to deploy for target '{}'.".format(target))
def main(args=None):
    """Main script entry point function.

    Parses command line arguments and configuration file and loops through
    the deployment targets and performs the deployment task at hand on each
    requested target.

    """
    ap = argparse.ArgumentParser(description=__doc__.splitlines()[0])
    ap.add_argument('-v', '--verbose', action="store_true",
        help="Enable verbose output")
    ap.add_argument('-c', '--config', default="deploy.conf",
        help="Deployment configuration settings file (default: %(default)s)")
    ap.add_argument('target', nargs="*",
        help="Deployment target(s) (default: all)")

    args = ap.parse_args(args if args is not None else sys.argv[1:])

    if args.verbose:
        loglevel = logging.DEBUG
    else:
        loglevel = logging.INFO

    logging.basicConfig(level=loglevel)

    config = read_ini_config(args.config)
    log.debug("Deployment configuration:\n%s", config)
    targets = (args.target if args.target
               else [k for k in config if k != 'zato'])
    log.debug("Deployment targets: %s", ", ".join(targets))
    config.verbose = args.verbose

    if not targets:
        msg = "No deployment targets defined in deployment configuration."
        log.error(msg)
        return msg

    redis_connections = set()

    for target in targets:
        if target not in config:
            msg = ("Deployment target '{}' not defined in deployment "
                   "configuration.".format(target))
            log.error(msg)
            return msg

        settings_fn = config[target].get('settings')

        if settings_fn:
            if exists(settings_fn):
                try:
                    urn, settings = read_settings(settings_fn)
                except Exception as exc:
                    msg = "Could not load settings: %s" % exc
                    log.error(msg)
                    return(msg)
            else:
                msg = "Settings file '%s' not found. Aborting." % settings_fn
                log.warn(msg)
                return msg
        elif exists('settings.conf'):
            try:
                urn, settings = read_settings('settings.conf')
            except Exception as exc:
                msg = "Could not load settings: %s" % exc
                log.error(msg)
                return(msg)
        else:
            log.info("No settings file specified and no default file found.")
            continue

        host = config[target].get('kvdb_host') or REDIS_HOST
        port = int(config[target].get('kvdb_port') or REDIS_PORT)
        db = int(config[target].get('kvdb_db') or 0)
        password = config[target].get('kvdb_password') or None
        log.debug("Redis connection settings: host='%s' port=%s db=%i",
                  host, port, db)

        if (host, port) not in redis_connections:
            redis_connections.add((host, port, db))
            try:
                write_settings_to_db(settings, urn, host, port, db, password)
            except redis.ResponseError as exc:
                log.error("Could not write settings to Redis DB: %s", exc)
                return 1
        else:
            log.info("Redis database %i at %s:%s already updated.",
                     db, host, port)
def main(args=None):
    """Main script entry point function.

    Parses command line arguments and configuration file and loops through
    the deployment targets and performs the deployment task at hand on each
    requested target.

    """
    ap = argparse.ArgumentParser(description=__doc__.splitlines()[0])
    ap.add_argument('-v',
                    '--verbose',
                    action="store_true",
                    help="Enable verbose output")
    ap.add_argument(
        '-c',
        '--config',
        default="deploy.conf",
        help="Deployment configuration settings file (default: %(default)s)")
    ap.add_argument('target',
                    nargs="*",
                    help="Deployment target(s) (default: all)")

    args = ap.parse_args(args if args is not None else sys.argv[1:])

    if args.verbose:
        loglevel = logging.DEBUG
    else:
        loglevel = logging.INFO

    logging.basicConfig(level=loglevel)

    config = read_ini_config(args.config)
    log.debug("Deployment configuration:\n%s", config)
    targets = (args.target
               if args.target else [k for k in config if k != 'zato'])
    log.debug("Deployment targets: %s", ", ".join(targets))
    config.verbose = args.verbose

    if not targets:
        msg = "No deployment targets defined in deployment configuration."
        log.error(msg)
        return msg

    redis_connections = set()

    for target in targets:
        if target not in config:
            msg = ("Deployment target '{}' not defined in deployment "
                   "configuration.".format(target))
            log.error(msg)
            return msg

        settings_fn = config[target].get('settings')

        if settings_fn:
            if exists(settings_fn):
                try:
                    urn, settings = read_settings(settings_fn)
                except Exception as exc:
                    msg = "Could not load settings: %s" % exc
                    log.error(msg)
                    return (msg)
            else:
                msg = "Settings file '%s' not found. Aborting." % settings_fn
                log.warn(msg)
                return msg
        elif exists('settings.conf'):
            try:
                urn, settings = read_settings('settings.conf')
            except Exception as exc:
                msg = "Could not load settings: %s" % exc
                log.error(msg)
                return (msg)
        else:
            log.info("No settings file specified and no default file found.")
            continue

        host = config[target].get('kvdb_host') or REDIS_HOST
        port = int(config[target].get('kvdb_port') or REDIS_PORT)
        db = int(config[target].get('kvdb_db') or 0)
        password = config[target].get('kvdb_password') or None
        log.debug("Redis connection settings: host='%s' port=%s db=%i", host,
                  port, db)

        if (host, port) not in redis_connections:
            redis_connections.add((host, port, db))
            try:
                write_settings_to_db(settings, urn, host, port, db, password)
            except redis.ResponseError as exc:
                log.error("Could not write settings to Redis DB: %s", exc)
                return 1
        else:
            log.info("Redis database %i at %s:%s already updated.", db, host,
                     port)
def main(args=None):
    """Main script entry point function.

    Parses command line arguments and configuration file and loops through
    the deployment targets and performs the deployment task at hand on each
    requested target.

    """
    ap = argparse.ArgumentParser(description=__doc__.splitlines()[0])
    ap.add_argument('-v',
                    '--verbose',
                    action="store_true",
                    help="Enable verbose output")
    ap.add_argument(
        '-c',
        '--config',
        default="deploy.conf",
        help="Deployment configuration settings file (default: %(default)s)")
    ap.add_argument('target',
                    nargs="*",
                    help="Deployment target(s) (default: all)")

    args = ap.parse_args(args if args is not None else sys.argv[1:])

    if args.verbose:
        loglevel = logging.DEBUG
    else:
        loglevel = logging.INFO

    logging.basicConfig(level=loglevel)

    config = read_ini_config(args.config)
    log.debug("Deployment configuration:\n%s", config)
    targets = (args.target
               if args.target else [k for k in config if k != 'zato'])
    log.debug("Deployment targets: %s", ", ".join(targets))
    config.verbose = args.verbose

    if not targets:
        msg = "No deployment targets defined in deployment configuration."
        log.error(msg)
        return msg

    for target in targets:
        if target not in config:
            msg = ("Deployment target '{}' not defined in deployment "
                   "configuration.".format(target))
            log.error(msg)
            return msg

        target_services = []
        for srv in config[target].get('modules', '').split(','):
            srv = srv.strip()

            if not srv:
                continue

            target_services.extend(glob.glob(srv))

        log.debug("Service modules to deploy to target '{}': {}".format(
            target, ", ".join(target_services)))

        config[target].setdefault('verbose', args.verbose)

        if target_services:
            for module in target_services:
                if exists(module):
                    upload_service(config[target], module)
                else:
                    msg = ("Service module file '{}' not found. "
                           "Aborting.".format(module))
                    log.error(msg)
                    return msg
        else:
            log.info(
                "No service modules to deploy for target '{}'.".format(target))
def main(args=None):
    """Main script entry point function.

    Parses command line arguments and configuration file and loops through
    the deployment targets and performs the deployment task at hand on each
    requested target.

    """
    ap = argparse.ArgumentParser(description=__doc__.splitlines()[0])
    ap.add_argument('-v',
                    '--verbose',
                    action="store_true",
                    help="Enable verbose output")
    ap.add_argument(
        '-c',
        '--config',
        default="deploy.conf",
        help="Deployment configuration settings file (default: %(default)s)")
    ap.add_argument('--outgoings',
                    default="outgoings.conf",
                    help="Outgoing definition file (default: %(default)s)")
    ap.add_argument('targets',
                    nargs="*",
                    help="Deployment targets (default: all)")

    args = ap.parse_args(args if args is not None else sys.argv[1:])

    if args.verbose:
        loglevel = logging.DEBUG
    else:
        loglevel = logging.INFO

    logging.basicConfig(level=loglevel)

    config = read_ini_config(args.config)
    log.debug("Deployment configuration:\n%s", config)
    if exists(args.outgoings):
        outgoings = read_ini_config(args.outgoings)
        log.debug("Outgoing definitions:\n%s", outgoings)
    else:
        log.warning("Outgoing definitions file '%s' not found. Nothing to do.",
                    args.outgoings)
        return 0

    targets = (args.targets
               if args.targets else [k for k in config if k != 'zato'])
    log.debug("Deployment targets: %s", ", ".join(targets))

    if not targets:
        msg = "No deployment targets defined in deployment configuration."
        log.error(msg)
        return msg

    for target in targets:
        if target not in config:
            msg = ("Deployment target '{}' not defined in deployment "
                   "configuration.".format(target))
            log.error(msg)
            return msg

        target_outgoings = [
            og.strip() for og in config[target].get('outgoings', '').split(',')
            if og.strip()
        ]

        if target_outgoings == ['*']:
            target_outgoings = list(outgoings.keys())

        log.debug("Outgoings for target '{}': {}".format(
            target, ", ".join(target_outgoings)))

        existing_outgoings = dict(
            (ch.name, ch) for ch in get_outgoing_list(config[target]))
        log.debug("Existing outgoings on zato cluster: %s",
                  ", ".join(existing_outgoings))

        config[target].setdefault('verbose', args.verbose)

        if target_outgoings:
            for ident in target_outgoings:
                outgoing = outgoings.get(ident)
                if outgoing:
                    if outgoing.name in existing_outgoings:
                        log.info("Outgoing '{}' already exists in zato "
                                 "cluster. Updating.".format(outgoing.name))
                        create_or_update_outgoing(
                            config[target],
                            outgoing,
                            update=existing_outgoings[outgoing.name].id)
                    else:
                        create_or_update_outgoing(config[target], outgoing)
                else:
                    msg = ("Outgoing '{}' for target '{}' not found "
                           "in outgoing definitions".format(ident, target))
                    log.error(msg)
                    return msg
        else:
            log.info("No outgoings to create for target '{}'.".format(target))
def main(args=None):
    """Main script entry point function.

    Parses command line arguments and configuration file and loops through
    the deployment targets and performs the deployment task at hand on each
    requested target.

    """
    ap = argparse.ArgumentParser(description=__doc__.splitlines()[0])
    ap.add_argument('-v', '--verbose', action="store_true",
        help="Enable verbose output")
    ap.add_argument('-c', '--config', default="deploy.conf",
        help="Deployment configuration settings file (default: %(default)s)")
    ap.add_argument('--channels', default="channels.conf",
        help="Channel definition file (default: %(default)s)")
    ap.add_argument('targets', nargs="*",
        help="Deployment targets (default: all)")

    args = ap.parse_args(args if args is not None else sys.argv[1:])

    if args.verbose:
        loglevel = logging.DEBUG
    else:
        loglevel = logging.INFO

    logging.basicConfig(level=loglevel)

    config = read_ini_config(args.config)
    log.debug("Deployment configuration:\n%s", config)
    if exists(args.channels):
        channels = read_ini_config(args.channels)
        log.debug("Channel definitions:\n%s", channels)
    else:
        log.warning("Channel definitions file '%s' not found. Nothing to do.",
            args.channels)
        return 0

    targets = (args.targets if args.targets
               else [k for k in config if k != 'zato'])
    log.debug("Deployment targets: %s", ", ".join(targets))
    config.verbose = args.verbose

    if not targets:
        msg = "No deployment targets defined in deployment configuration."
        log.error(msg)
        return msg

    for target in targets:
        if target not in config:
            msg = ("Deployment target '{}' not defined in deployment "
                   "configuration.".format(target))
            log.error(msg)
            return msg

        target_channels = [ch.strip()
            for ch in config[target].get('channels', '').split(',')
                if ch.strip()]

        if target_channels == ['*']:
            target_channels = list(channels.keys())

        log.debug("Channels for target '{}': {}".format(
            target, ", ".join(target_channels)))

        existing_channels = dict((ch.name, ch)
                                 for ch in get_channel_list(config[target]))
        log.debug("Existing channels on zato cluster: %s",
                  ", ".join(existing_channels))

        config[target].setdefault('verbose', args.verbose)

        existing_services = [srv.name for srv in
                             get_service_list(config[target], '*')]
        log.debug("Existing (non-internal) services on zato cluster: %s",
                  ", ".join(existing_services))

        if target_channels:
            for ident in target_channels:
                channel = channels.get(ident)
                if channel:
                    service = channel.get('service')
                    if service not in existing_services:
                        raise ValueError("Channel '{}' references unknown "
                            "service '{}'".format(channel.name, service))

                    if channel.name in existing_channels:
                        log.info("Channel '{}' already exists in zato "
                                 "cluster. Updating.".format(channel.name))
                        create_or_update_channel(config[target], channel,
                            update=existing_channels[channel.name].id)
                    else:
                        create_or_update_channel(config[target], channel)
                else:
                    msg = ("Channel '{}' for target '{}' not found "
                        "in channel definitions".format(ident, target))
                    log.error(msg)
                    return msg
        else:
            log.info("No channels to create for target '{}'.".format(target))
Beispiel #9
0
def main(args=None):
    """Main script entry point function.

    Parses command line arguments and configuration file and loops through
    the deployment targets and performs the deployment task at hand on each
    requested target.

    """
    ap = argparse.ArgumentParser(description=__doc__.splitlines()[0])
    ap.add_argument('-v',
                    '--verbose',
                    action="store_true",
                    help="Enable verbose output")
    ap.add_argument(
        '-c',
        '--config',
        default="deploy.conf",
        help="Deployment configuration settings file (default: %(default)s)")
    ap.add_argument('--channels',
                    default="channels.conf",
                    help="Channel definition file (default: %(default)s)")
    ap.add_argument('targets',
                    nargs="*",
                    help="Deployment targets (default: all)")

    args = ap.parse_args(args if args is not None else sys.argv[1:])

    if args.verbose:
        loglevel = logging.DEBUG
    else:
        loglevel = logging.INFO

    logging.basicConfig(level=loglevel)

    config = read_ini_config(args.config)
    log.debug("Deployment configuration:\n%s", config)
    if exists(args.channels):
        channels = read_ini_config(args.channels)
        log.debug("Channel definitions:\n%s", channels)
    else:
        log.warning("Channel definitions file '%s' not found. Nothing to do.",
                    args.channels)
        return 0

    targets = (args.targets
               if args.targets else [k for k in config if k != 'zato'])
    log.debug("Deployment targets: %s", ", ".join(targets))
    config.verbose = args.verbose

    if not targets:
        msg = "No deployment targets defined in deployment configuration."
        log.error(msg)
        return msg

    for target in targets:
        if target not in config:
            msg = ("Deployment target '{}' not defined in deployment "
                   "configuration.".format(target))
            log.error(msg)
            return msg

        target_channels = [
            ch.strip() for ch in config[target].get('channels', '').split(',')
            if ch.strip()
        ]

        if target_channels == ['*']:
            target_channels = list(channels.keys())

        log.debug("Channels for target '{}': {}".format(
            target, ", ".join(target_channels)))

        existing_channels = dict(
            (ch.name, ch) for ch in get_channel_list(config[target]))
        log.debug("Existing channels on zato cluster: %s",
                  ", ".join(existing_channels))

        config[target].setdefault('verbose', args.verbose)

        existing_services = [
            srv.name for srv in get_service_list(config[target], '*')
        ]
        log.debug("Existing (non-internal) services on zato cluster: %s",
                  ", ".join(existing_services))

        if target_channels:
            for ident in target_channels:
                channel = channels.get(ident)
                if channel:
                    service = channel.get('service')
                    if service not in existing_services:
                        raise ValueError("Channel '{}' references unknown "
                                         "service '{}'".format(
                                             channel.name, service))

                    if channel.name in existing_channels:
                        log.info("Channel '{}' already exists in zato "
                                 "cluster. Updating.".format(channel.name))
                        create_or_update_channel(
                            config[target],
                            channel,
                            update=existing_channels[channel.name].id)
                    else:
                        create_or_update_channel(config[target], channel)
                else:
                    msg = ("Channel '{}' for target '{}' not found "
                           "in channel definitions".format(ident, target))
                    log.error(msg)
                    return msg
        else:
            log.info("No channels to create for target '{}'.".format(target))
Beispiel #10
0
def main(args=None):
    """Main script entry point function.

    Parses command line arguments and configuration file and loops through
    the deployment targets and performs the deployment task at hand on each
    requested target.

    """
    ap = argparse.ArgumentParser(description=__doc__.splitlines()[0])
    ap.add_argument('-v', '--verbose', action="store_true",
        help="Enable verbose output")
    ap.add_argument('-c', '--config', default="deploy.conf",
        help="Deployment configuration settings file (default: %(default)s)")
    ap.add_argument('--secdefs', default="secdefs.conf",
        help="Security definitions file (default: %(default)s)")
    ap.add_argument('targets', nargs="*",
        help="Deployment targets (default: all)")

    args = ap.parse_args(args if args is not None else sys.argv[1:])

    if args.verbose:
        loglevel = logging.DEBUG
    else:
        loglevel = logging.INFO

    logging.basicConfig(level=loglevel)

    config = read_ini_config(args.config)
    log.debug("Deployment configuration:\n%s", config)
    if exists(args.secdefs):
        secdefs = read_ini_config(args.secdefs)
        log.debug("Security definitions:\n%s", secdefs)
    else:
        log.warning("Security definitions file '%s' not found. Nothing to do.",
            args.secdefs)
        return 0

    targets = (args.targets if args.targets
               else [k for k in config if k != 'zato'])
    log.debug("Deployment targets: %s", ", ".join(targets))
    config.verbose = args.verbose

    if not targets:
        msg = "No deployment targets defined in deployment configuration."
        log.error(msg)
        return msg

    for target in targets:
        if target not in config:
            msg = ("Deployment target '{}' not defined in deployment "
                   "configuration.".format(target))
            log.error(msg)
            return msg

        target_secdefs = [ch.strip()
            for ch in config[target].get('secdefs', '').split(',')
                if ch.strip()]

        if target_secdefs == ['*']:
            target_secdefs = list(secdefs.keys())

        log.debug("Security definitions for target '%s': %s", target,
                  ", ".join(target_secdefs))

        existing_secdefs = dict((ch.name, ch)
                                for ch in get_security_list(config[target]))
        log.debug("Existing security definitions on zato cluster: %s",
                  ", ".join(existing_secdefs))

        config[target].setdefault('verbose', args.verbose)

        if target_secdefs:
            for ident in target_secdefs:
                secdef = secdefs.get(ident)
                if secdef:
                    if secdef.name in existing_secdefs:
                        log.info("Security definition '%s' already exists in "
                                 "zato cluster. Updating.", secdef.name)
                        create_or_update_secdef(config[target], secdef,
                            update=existing_secdefs[secdef.name].id)
                    else:
                        create_or_update_secdef(config[target], secdef)
                else:
                    msg = ("Security definition '{}' for target '{}' not found"
                           " in definitions".format(ident, target))
                    log.error(msg)
                    return msg
        else:
            log.info("No security definitions to create for target '%s'.",
                     target)