def delete_mr_client(**kwargs):
    '''
    Delete the client (publisher or subscriber).
    Expect property 'client_id' to have been set in the instance's runtime_properties
    when the client was created.
    '''
    try:
        target_topic = ctx.target.node.id
        client_id = ctx.source.instance.runtime_properties[target_topic][
            "client_id"]
        ctx.logger.info("Attempting to delete client {0} ".format(client_id))
        dmc = DMaaPControllerHandle(DMAAP_API_URL, DMAAP_USER, DMAAP_PASS,
                                    ctx.logger)
        c = dmc.delete_client(client_id)
        c.raise_for_status()

        ctx.logger.info("Deleted client {0}".format(client_id))

        # Attempt to remove the entire ":dmaap" entry from the Consul KV store
        # Will quietly do nothing if the entry has already been removed
        ch = ConsulHandle("http://{0}:8500".format(CONSUL_HOST), None, None,
                          ctx.logger)
        ch.delete_entry("{0}:dmaap".format(
            ctx.source.instance.runtime_properties['service_component_name']))

    except Exception as e:
        ctx.logger.error("Error deleting MR client: {er}".format(er=e))
def delete_dr_subscriber(**kwargs):
    '''
    Deletes subscriber (the source of the subscribes_to_files relationship)
    from the feed (the target of the relationship).
    Assumes that the source node's runtime properties dictionary for the target feed
    includes 'subscriber_id', set when the publisher was added to the feed.
    '''
    try:
        # Get the subscriber id
        target_feed = ctx.target.node.id
        subscriber_id = ctx.source.instance.runtime_properties[target_feed]["subscriber_id"]
        ctx.logger.info("Attempting to delete subscriber {0} from feed {1}".format(subscriber_id, target_feed))

        # Make the request
        dmc = DMaaPControllerHandle(DMAAP_API_URL, DMAAP_USER, DMAAP_PASS, ctx.logger)
        del_result = dmc.delete_subscriber(subscriber_id)
        del_result.raise_for_status()

        ctx.logger.info("Deleted subscriber {0}".format(subscriber_id))

        # Attempt to remove the entire ":dmaap" entry from the Consul KV store
        # Will quietly do nothing if the entry has already been removed
        ch = ConsulHandle("http://{0}:8500".format(CONSUL_HOST), None, None, ctx.logger)
        ch.delete_entry("{0}:dmaap".format(ctx.source.instance.runtime_properties['service_component_name']))

    except Exception as e:
        ctx.logger.error("Error deleting subscriber: {er}".format(er=e))
def delete_dr_publisher(**kwargs):
    '''
    Deletes publisher (the source of the publishes_files relationship)
    from the feed (the target of the relationship).
    Assumes that the 'publisher_id' property was added to the dictionary of feed-related properties,
    when the publisher was added to the feed.
    '''

    try:
        # Make sure we have a name under which to store DMaaP configuration
        # Check early so we don't needlessly create DMaaP entities
        if 'service_component_name' not in ctx.source.instance.runtime_properties:
            raise Exception("Source node does not have 'service_component_name' in runtime_properties")

        # Get the publisher id
        target_feed = ctx.target.node.id
        publisher_id = ctx.source.instance.runtime_properties[target_feed]["publisher_id"]
        ctx.logger.info("Attempting to delete publisher {0}".format(publisher_id))

        # Make the request
        dmc = DMaaPControllerHandle(DMAAP_API_URL, DMAAP_USER, DMAAP_PASS, ctx.logger)
        del_result = dmc.delete_publisher(publisher_id)
        del_result.raise_for_status()

        ctx.logger.info("Deleted publisher {0}".format(publisher_id))

        # Attempt to remove the entire ":dmaap" entry from the Consul KV store
        # Will quietly do nothing if the entry has already been removed
        ch = ConsulHandle("http://{0}:8500".format(CONSUL_HOST), None, None, ctx.logger)
        ch.delete_entry("{0}:dmaap".format(ctx.source.instance.runtime_properties['service_component_name']))

    except Exception as e:
        ctx.logger.error("Error deleting publisher: {er}".format(er=e))
def add_dr_publisher(**kwargs):
    '''
    Sets up the source of the publishes_relationship as a publisher to the feed that
    is the target of the relationship
        Assumes target (the feed) has the following runtime properties set
            - feed_id
            - log_url
            - publish_url
        Assumes source (the publisher) has a runtime property whose name matches the node name of the feed.
        This is a dictionary containing one property:
            - location   (the dcaeLocationName to pass when adding the publisher to the feed)
        Generates a user name and password that the publisher will need to use when publishing
        Adds the following properties to the dictionary above:
             - publish_url
             - log_url
             - username
             - password
    '''
    try:
        # Make sure we have a name under which to store DMaaP configuration
        # Check early so we don't needlessly create DMaaP entities
        if 'service_component_name' not in ctx.source.instance.runtime_properties:
            raise Exception("Source node does not have 'service_component_name' in runtime_properties")

        target_feed = ctx.target.node.id
        ctx.logger.info("Attempting to add publisher {0} to feed {1}".format(ctx.source.node.id, target_feed))

        # Set up the parameters for the add_publisher request to the DMaaP bus controller
        feed_id = ctx.target.instance.runtime_properties["feed_id"]
        location = ctx.source.instance.runtime_properties[target_feed]["location"]
        username = random_string(8)
        password = random_string(16)

        # Make the request to add the publisher to the feed
        dmc = DMaaPControllerHandle(DMAAP_API_URL, DMAAP_USER, DMAAP_PASS, ctx.logger)
        add_pub = dmc.add_publisher(feed_id, location, username, password)
        add_pub.raise_for_status()
        publisher_info = add_pub.json()
        publisher_id = publisher_info["pubId"]
        ctx.logger.info("Added publisher id {0} to feed {1} at {2}, with user {3}, pass {4}".format(publisher_id, feed_id, location, username, password))

        # Set runtime properties on the source
        ctx.source.instance.runtime_properties[target_feed] = {
           "publisher_id" : publisher_id,
           "location" : location,
           "publish_url" : ctx.target.instance.runtime_properties["publish_url"],
           "log_url" : ctx.target.instance.runtime_properties["log_url"],
           "username" : username,
           "password" : password
        }

        # Set key in Consul
        ch = ConsulHandle("http://{0}:8500".format(CONSUL_HOST), None, None, ctx.logger)
        cpy = dict(ctx.source.instance.runtime_properties[target_feed])
        ch.add_to_entry("{0}:dmaap".format(ctx.source.instance.runtime_properties['service_component_name']), target_feed, cpy)

    except Exception as e:
        ctx.logger.error("Error adding publisher to feed: {er}".format(er=e))
        raise NonRecoverableError(e)
def add_dr_subscriber(**kwargs):
    '''
    Sets up the source of the subscribes_to_files relationship as a subscriber to the
    feed that is the target of the relationship.
    Assumes target (the feed) has the following runtime property set
        - feed_id
    Assumes source (the subscriber) has a runtime property whose name matches the node name of the feed.
    This is a dictionary containing the following properties:
        - location   (the dcaeLocationName to pass when adding the publisher to the feed)
        - delivery_url (the URL to which data router will deliver files)
        - username (the username data router will use when delivering files)
        - password (the password data router will use when delivering files)
    Adds a property to the dictionary above:
        - subscriber_id  (used to delete the subscriber in the uninstall workflow
    '''
    try:
        target_feed = ctx.target.node.id
        ctx.logger.info("Attempting to add subscriber {0} to feed {1}".format(ctx.source.node.id, target_feed))

        # Get the parameters for the call
        feed_id = ctx.target.instance.runtime_properties["feed_id"]
        feed = ctx.source.instance.runtime_properties[target_feed]
        location = feed["location"]
        delivery_url = feed["delivery_url"]
        username = feed["username"]
        password = feed["password"]
        decompress = feed["decompress"] if "decompress" in feed else False
        privileged = feed["privileged"] if "privileged" in feed else False

        # Make the request to add the subscriber to the feed
        dmc = DMaaPControllerHandle(DMAAP_API_URL, DMAAP_USER, DMAAP_PASS, ctx.logger)
        add_sub = dmc.add_subscriber(feed_id, location, delivery_url,username, password, decompress, privileged)
        add_sub.raise_for_status()
        subscriber_info = add_sub.json()
        subscriber_id = subscriber_info["subId"]
        ctx.logger.info("Added subscriber id {0} to feed {1} at {2}".format(subscriber_id, feed_id, location))

        # Add subscriber_id to the runtime properties
        # ctx.source.instance.runtime_properties[target_feed]["subscriber_id"] = subscriber_id
        ctx.source.instance.runtime_properties[target_feed] = {
            "subscriber_id": subscriber_id,
            "location" : location,
            "delivery_url" : delivery_url,
            "username" : username,
            "password" : password,
            "decompress": decompress,
            "privilegedSubscriber": privileged
        }
        ctx.logger.info("on source: {0}".format(ctx.source.instance.runtime_properties[target_feed]))

        # Set key in Consul
        ch = ConsulHandle("http://{0}:8500".format(CONSUL_HOST), None, None, ctx.logger)
        cpy = dict(ctx.source.instance.runtime_properties[target_feed])
        ch.add_to_entry("{0}:dmaap".format(ctx.source.instance.runtime_properties['service_component_name']), target_feed, cpy)

    except Exception as e:
        ctx.logger.error("Error adding subscriber to feed: {er}".format(er=e))
        raise NonRecoverableError(e)
Ejemplo n.º 6
0
def _add_mr_client(ctype, actions):
    '''
    Adds the node represented by 'source' as a client (publisher or subscriber) to
    to topic represented by the 'target' node.  The list of actions in 'actions'
    determines whether the client is a subscriber or a publisher.

    Assumes target (the topic) has the following runtime property set
        - fqtn
    Assumes source (the client) has a runtime property whose name matches the node name of the feed.
    This is a dictionary containing the following properties:
        - location   (the dcaeLocationName to pass when adding the client to the topic)
        - client_role (the AAF client role under which the client will access the topic)
    Adds two properties to the dictionary above:
        - topic_url (the URL that the client can use to access the topic)
        - client_id  (used to delete the client in the uninstall workflow)
    '''
    try:
        # Make sure we have a name under which to store DMaaP configuration
        # Check early so we don't needlessly create DMaaP entities
        if 'service_component_name' not in ctx.source.instance.runtime_properties:
            raise Exception("Source node does not have 'service_component_name' in runtime_properties")

        target_topic = ctx.target.node.id           # Key for the source's dictionary with topic-related info
        fqtn = ctx.target.instance.runtime_properties["fqtn"]
        ctx.logger.info("Attempting to add {0} as {1} to topic {2}".format(ctx.source.node.id, ctype, fqtn))

        # Get the parameters needed for adding the client
        location = ctx.source.instance.runtime_properties[target_topic]["location"]
        client_role = ctx.source.instance.runtime_properties[target_topic]["client_role"]

        # Make the request to add the client to the topic
        dmc = DMaaPControllerHandle(DMAAP_API_URL, DMAAP_USER, DMAAP_PASS, ctx.logger)
        c = dmc.create_client(fqtn, location, client_role, actions)
        c.raise_for_status()
        client_info = c.json()
        client_id = client_info["mrClientId"]
        topic_url = client_info["topicURL"]

        # Update source's runtime properties
        #ctx.source.instance.runtime_properties[target_topic]["topic_url"] = topic_url
        #ctx.source.instance.runtime_properties[target_topic]["client_id"] = client_id
        ctx.source.instance.runtime_properties[target_topic] = {
            "topic_url" : topic_url,
            "client_id" : client_id,
            "location" : location,
            "client_role" : client_role
        }

        ctx.logger.info("Added {0} id {1} to feed {2} at {3}".format(ctype, client_id, fqtn, location))

        # Set key in Consul
        ch = ConsulHandle("http://{0}:8500".format(CONSUL_HOST), None, None, ctx.logger)
        ch.add_to_entry("{0}:dmaap".format(ctx.source.instance.runtime_properties['service_component_name']), target_topic, ctx.source.instance.runtime_properties[target_topic])

    except Exception as e:
        ctx.logger.error("Error adding client to feed: {er}".format(er=e))
        raise NonRecoverableError(e)
Ejemplo n.º 7
0
def create_feed(**kwargs):
    '''
    Create a new data router feed
        Expects "feed_name" to be set in node properties
        If 'feed_name' is not set or is empty, generates a random one.
        Allows "feed_version", "feed_description", "aspr_classification" and "useExisting" as optional properties
        (Sets default values if not provided )
        Sets instance runtime properties:
        Note that 'useExisting' is a flag indicating whether DBCL will use existing feed if the feed already exists.
            - "feed_id"
            - "publish_url"
            - "log_url"

    '''
    try:
        # Make sure there's a feed_name
        feed_name = ctx.node.properties.get("feed_name")
        if not (feed_name and feed_name.strip()):
            feed_name = random_string(12)

        # Set defaults/placeholders for the optional properties for the feed
        if "feed_version" in ctx.node.properties:
            feed_version = ctx.node.properties["feed_version"]
        else:
            feed_version = "0.0"
        if "feed_description" in ctx.node.properties:
            feed_description = ctx.node.properties["feed_description"]
        else:
            feed_description = "No description provided"
        if "aspr_classification" in ctx.node.properties:
            aspr_classification = ctx.node.properties["aspr_classification"]
        else:
            aspr_classification = "unclassified"
        if "useExisting" in ctx.node.properties:
            useExisting = ctx.node.properties["useExisting"]
        else:
            useExisting = False

        # Make the request to the controller
        dmc = DMaaPControllerHandle(DMAAP_API_URL, DMAAP_USER, DMAAP_PASS,
                                    ctx.logger)
        ctx.logger.info("Attempting to create feed name {0}".format(feed_name))
        f = dmc.create_feed(feed_name, feed_version, feed_description,
                            aspr_classification, DMAAP_OWNER, useExisting)
        f.raise_for_status()

        # Capture important properties from the result
        feed = f.json()
        ctx.instance.runtime_properties["feed_id"] = feed["feedId"]
        ctx.instance.runtime_properties["publish_url"] = feed["publishURL"]
        ctx.instance.runtime_properties["log_url"] = feed["logURL"]
        ctx.logger.info("Created feed name {0} with feed id {1}".format(
            feed_name, feed["feedId"]))

    except Exception as e:
        ctx.logger.error("Error creating feed: {er}".format(er=e))
        raise NonRecoverableError(e)
Ejemplo n.º 8
0
def delete_topic(**kwargs):
    '''
    Delete the topic.  Expects the instance runtime property "fqtn" to have been
    set when the topic was created.
    '''
    try:
        fqtn = ctx.instance.runtime_properties["fqtn"]
        dmc = DMaaPControllerHandle(DMAAP_API_URL, DMAAP_USER, DMAAP_PASS,
                                    ctx.logger)
        ctx.logger.info("Attempting to delete topic {0}".format(fqtn))
        t = dmc.delete_topic(fqtn)
        t.raise_for_status()

    except Exception as e:
        ctx.logger.error("Error getting existing topic: {er}".format(er=e))
Ejemplo n.º 9
0
def create_external_source_dr_bridge(**kwargs):
    try:
        # Get target feed id
        if 'feed_id' in ctx.target.instance.runtime_properties:
            target_feed_id = ctx.target.instance.runtime_properties['feed_id']
        else:
            raise Exception('Target feed has no feed_id property')

        dmc = DMaaPControllerHandle(DMAAP_API_URL, DMAAP_USER, DMAAP_PASS,
                                    ctx.logger)

        # Get a central location to use when creating a publisher
        loc = _get_central_location(dmc)

        # Create a publisher on the target feed
        publisher_id, username, userpw = _set_up_publisher(
            dmc, target_feed_id, loc)

        # Save the publisher info on the source node, indexed by the target node
        ctx.source.instance.runtime_properties[ctx.target.node.id] = {
            "publisher_id": publisher_id,
            "url": ctx.target.instance.runtime_properties["publish_url"],
            "username": username,
            "userpw": userpw
        }

    except Exception as e:
        ctx.logger.error(
            "Error creating external source bridge: {0}".format(e))
Ejemplo n.º 10
0
def delete_feed(**kwargs):
    '''
    Delete a feed
        Expects "feed_id" to be set on the instance's runtime properties
    '''
    try:
        # Make the lookup request to the controllerid=ctx.node.properties["feed_id"]
        dmc = DMaaPControllerHandle(DMAAP_API_URL, DMAAP_USER, DMAAP_PASS,
                                    ctx.logger)
        f = dmc.delete_feed(ctx.instance.runtime_properties["feed_id"])
        f.raise_for_status()
        ctx.logger.info("Deleting feed id {0}".format(
            ctx.instance.runtime_properties["feed_id"]))

    except Exception as e:
        ctx.logger.error("Error deleting feed id {id}: {er}".format(
            id=ctx.instance.runtime_properties["feed_id"], er=e))
Ejemplo n.º 11
0
def get_existing_topic(**kwargs):
    '''
    Get data for an existing topic.
    Expects 'fqtn' as a node property.
    Copies this property to 'fqtn' in runtime properties for consistency
    with a newly-created topic.
    While there's no real need to make a call to the DMaaP bus controller,
    we do so just to make sure the fqtn is known to the controller, so we
    don't run into problems when we try to add a publisher or subscriber later.
    '''
    try:
        dmc = DMaaPControllerHandle(DMAAP_API_URL, DMAAP_USER, DMAAP_PASS,
                                    ctx.logger)
        fqtn_input = False
        if "fqtn" in ctx.node.properties:
            fqtn = ctx.node.properties["fqtn"]
            fqtn_input = True
        elif "topic_name" in ctx.node.properties:
            topic_name = ctx.node.properties["topic_name"]
            ctx.logger.info(
                "Attempting to get fqtn for existing topic {0}".format(
                    topic_name))
            fqtn = dmc.get_topic_fqtn_by_name(topic_name)
            if fqtn is None:
                raise ValueError("Not find existing topic with name " +
                                 topic_name)
        else:
            ctx.logger.error(
                "Not find existing topic with name {0}".format(topic_name))
            raise ValueError(
                "Either fqtn or topic_name must be defined to get existing topic"
            )

        ctx.logger.info(
            "Attempting to get info for existing topic {0}".format(fqtn))
        t = dmc.get_topic_info(fqtn)
        t.raise_for_status()

        ctx.instance.runtime_properties["fqtn"] = fqtn

    except Exception as e:
        ctx.logger.error("Error getting existing topic: {er}".format(er=e))
        raise NonRecoverableError(e)
Ejemplo n.º 12
0
def remove_dr_bridge(**kwargs):
    try:

        dmc = DMaaPControllerHandle(DMAAP_API_URL, DMAAP_USER, DMAAP_PASS,
                                    ctx.logger)

        if ctx.target.node.id in ctx.source.instance.runtime_properties:

            if 'subscriber_id' in ctx.source.instance.runtime_properties[
                    ctx.target.node.id]:
                # Delete the subscription for this bridge
                ctx.logger.info(
                    "Removing bridge -- deleting subscriber {0}".format(
                        ctx.source.instance.runtime_properties[
                            ctx.target.node.id]['subscriber_id']))
                dmc.delete_subscriber(ctx.source.instance.runtime_properties[
                    ctx.target.node.id]['subscriber_id'])

            if 'publisher_id' in ctx.source.instance.runtime_properties:
                # Delete the publisher for this bridge
                ctx.logger.info(
                    "Removing bridge -- deleting publisher {0}".format(
                        ctx.source.instance.runtime_properties[
                            ctx.target.node.id]['publisher_id']))
                dmc.delete_publisher(ctx.source.instance.runtime_properties[
                    ctx.target.node.id]['publisher_id'])

        ctx.logger.info("Remove bridge from {0} to {1}".format(
            ctx.source.node.id, ctx.target.node.id))

    except Exception as e:
        ctx.logger.error("Error removing bridge: {0}".format(e))
Ejemplo n.º 13
0
def create_dr_bridge(**kwargs):

    try:

        # Get source and target feed ids
        if 'feed_id' in ctx.target.instance.runtime_properties:
            target_feed_id = ctx.target.instance.runtime_properties['feed_id']
        else:
            raise Exception('Target feed has no feed_id property')
        if 'feed_id' in ctx.source.instance.runtime_properties:
            source_feed_id = ctx.source.instance.runtime_properties['feed_id']
        else:
            raise Exception('Source feed has no feed_id property')

        dmc = DMaaPControllerHandle(DMAAP_API_URL, DMAAP_USER, DMAAP_PASS,
                                    ctx.logger)

        # Get a location to use when creating a publisher or subscriber--a central location seems reasonable
        loc = _get_central_location(dmc)

        ctx.logger.info(
            'Creating bridge from feed {0} to feed {1} using location {2}'.
            format(source_feed_id, target_feed_id, loc))

        # Add publisher to target feed
        publisher_id, username, userpw = _set_up_publisher(
            dmc, target_feed_id, loc)
        ctx.logger.info(
            "Added publisher id {0} to  target feed {1} with user {2}".format(
                publisher_id, target_feed_id, username))

        # Add subscriber to source feed
        delivery_url = ctx.target.instance.runtime_properties['publish_url']
        subscriber_info = _set_up_subscriber(dmc, source_feed_id, loc,
                                             delivery_url, username, userpw)
        subscriber_id = subscriber_info["subId"]
        ctx.logger.info(
            "Added subscriber id {0} to source feed {1} with delivery url {2}".
            format(subscriber_id, source_feed_id, delivery_url))

        # Save the publisher and subscriber IDs on the source node, indexed by the target node id
        ctx.source.instance.runtime_properties[ctx.target.node.id] = {
            "publisher_id": publisher_id,
            "subscriber_id": subscriber_id
        }

    except Exception as e:
        ctx.logger.error("Error creating bridge: {0}".format(e))
        raise NonRecoverableError(e)
Ejemplo n.º 14
0
def create_external_dr_bridge(**kwargs):
    try:

        # Make sure target feed has full set of properties
        if 'url' in ctx.target.node.properties and 'username' in ctx.target.node.properties and 'userpw' in ctx.target.node.properties:
            url = ctx.target.node.properties['url']
            username = ctx.target.node.properties['username']
            userpw = ctx.target.node.properties['userpw']
        else:
            raise Exception(
                "Target feed missing url, username, and/or user pw")

        # Make sure source feed has a feed ID
        if 'feed_id' in ctx.source.instance.runtime_properties:
            source_feed_id = ctx.source.instance.runtime_properties['feed_id']
        else:
            raise Exception('Source feed has no feed_id property')

        dmc = DMaaPControllerHandle(DMAAP_API_URL, DMAAP_USER, DMAAP_PASS,
                                    ctx.logger)

        # Get a central location to use when creating subscriber
        loc = _get_central_location(dmc)

        ctx.logger.info(
            'Creating external bridge from feed {0} to external url {1} using location {2}'
            .format(source_feed_id, url, loc))

        # Create subscription to source feed using properties of the external target feed
        subscriber_info = _set_up_subscriber(dmc, source_feed_id, loc, url,
                                             username, userpw)
        subscriber_id = subscriber_info["subId"]
        ctx.logger.info(
            "Added subscriber id {0} to source feed {1} with delivery url {2}".
            format(subscriber_id, source_feed_id, url))

        # Save the subscriber ID on the source node, indexed by the target node id
        ctx.source.instance.runtime_properties[ctx.target.node.id] = {
            "subscriber_id": subscriber_id
        }

    except Exception as e:
        ctx.logger.error("Error creating external bridge: {0}".format(e))
        raise NonRecoverableError(e)
def test_dmaapc(monkeypatch, mockconsul, mockdmaapbc):
    from dmaapplugin.dmaaputils import random_string

    config = mockconsul().get_config('mockkey')['dmaap']
    DMAAP_API_URL = config['url']
    DMAAP_USER = config['username']
    DMAAP_PASS = config['password']
    DMAAP_OWNER = config['owner']

    properties = {'fqdn': 'a.x.example.com', 'openstack': _goodosv2}
    mock_ctx = MockCloudifyContext(node_id='test_node_id',
                                   node_name='test_node_name',
                                   properties=properties,
                                   runtime_properties={
                                       "admin": {
                                           "user": "******"
                                       },
                                       "user": {
                                           "user": "******"
                                       },
                                       "viewer": {
                                           "user": "******"
                                       }
                                   })

    current_ctx.set(mock_ctx)

    kwargs = {
        "topic_name": "ONAP_test",
        "topic_description": "onap dmaap plugin unit test topic"
    }

    # Make sure there's a topic_name
    if "topic_name" in ctx.node.properties:
        topic_name = ctx.node.properties["topic_name"]
        if topic_name == '' or topic_name.isspace():
            topic_name = random_string(12)
    else:
        topic_name = random_string(12)

    # Make sure there's a topic description
    if "topic_description" in ctx.node.properties:
        topic_description = ctx.node.properties["topic_description"]
    else:
        topic_description = "No description provided"

    # ..and the truly optional setting
    if "txenable" in ctx.node.properties:
        txenable = ctx.node.properties["txenable"]
    else:
        txenable = False

    if "replication_case" in ctx.node.properties:
        replication_case = ctx.node.properties["replication_case"]
    else:
        replication_case = None

    if "global_mr_url" in ctx.node.properties:
        global_mr_url = ctx.node.properties["global_mr_url"]
    else:
        global_mr_url = None

    dmc = DMaaPControllerHandle(DMAAP_API_URL, DMAAP_USER, DMAAP_PASS,
                                ctx.logger)
    ctx.logger.info("Attempting to create topic name {0}".format(topic_name))
    t = dmc.create_topic(topic_name, topic_description, txenable, DMAAP_OWNER,
                         replication_case, global_mr_url)

    # Capture important properties from the result
    topic = t.json()
    ctx.instance.runtime_properties["fqtn"] = topic["fqtn"]

    # test DMaaPControllerHandle functions
    path = "myPath"
    url = dmc._make_url(path)
    rc = dmc._get_resource(path)
    rc = dmc._create_resource(path, None)
    rc = dmc._delete_resource(path)
Ejemplo n.º 16
0
def create_topic(**kwargs):
    '''
    Creates a message router topic.
    Allows 'topic_name', 'topic_description', 'txenable', 'replication_case', 'global_mr_url',
    and 'useExisting' as optional node properties.  If 'topic_name' is not set,
    generates a random one.
    Sets 'fqtn' in the instance runtime_properties.
    Note that 'txenable' is a Message Router flag indicating whether transactions
    are enabled on the topic.
    Note that 'useExisting' is a flag indicating whether DBCL will use existing topic if
    the topic already exists.
    '''
    try:
        # Make sure there's a topic_name
        if "topic_name" in ctx.node.properties:
            topic_name = ctx.node.properties["topic_name"]
            if topic_name == '' or topic_name.isspace():
                topic_name = random_string(12)
        else:
            topic_name = random_string(12)

        # Make sure there's a topic description
        if "topic_description" in ctx.node.properties:
            topic_description = ctx.node.properties["topic_description"]
        else:
            topic_description = "No description provided"

        # ..and the truly optional setting
        if "txenable" in ctx.node.properties:
            txenable = ctx.node.properties["txenable"]
        else:
            txenable = False

        if "replication_case" in ctx.node.properties:
            replication_case = ctx.node.properties["replication_case"]
        else:
            replication_case = None

        if "global_mr_url" in ctx.node.properties:
            global_mr_url = ctx.node.properties["global_mr_url"]
        else:
            global_mr_url = None

        if "useExisting" in ctx.node.properties:
            useExisting = ctx.node.properties["useExisting"]
        else:
            useExisting = False

        # Make the request to the controller
        dmc = DMaaPControllerHandle(DMAAP_API_URL, DMAAP_USER, DMAAP_PASS,
                                    ctx.logger)
        ctx.logger.info(
            "Attempting to create topic name {0}".format(topic_name))
        t = dmc.create_topic(topic_name, topic_description, txenable,
                             DMAAP_OWNER, replication_case, global_mr_url,
                             useExisting)
        t.raise_for_status()

        # Capture important properties from the result
        topic = t.json()
        ctx.instance.runtime_properties["fqtn"] = topic["fqtn"]

    except Exception as e:
        ctx.logger.error("Error creating topic: {er}".format(er=e))
        raise NonRecoverableError(e)
Ejemplo n.º 17
0
def get_existing_feed(**kwargs):
    '''
    Find information for an existing data router feed
        Expects "feed_id" to be set in node properties -- uniquely identifies the feed
        Sets instance runtime properties:
            - "feed_id"
            - "publish_url"
            - "log_url"
    '''

    try:
        # Make the lookup request to the controller
        dmc = DMaaPControllerHandle(DMAAP_API_URL, DMAAP_USER, DMAAP_PASS,
                                    ctx.logger)
        ctx.logger.info("DMaaPControllerHandle() returned")
        feed_id_input = False
        if "feed_id" in ctx.node.properties:
            feed_id_input = True
            f = dmc.get_feed_info(ctx.node.properties["feed_id"])
        elif "feed_name" in ctx.node.properties:
            feed_name = ctx.node.properties["feed_name"]
            f = dmc.get_feed_info_by_name(feed_name)
            if f is None:
                ctx.logger.error(
                    "Not find existing feed with feed name {0}".format(
                        feed_name))
                raise ValueError("Not find existing feed with feed name " +
                                 feed_name)
        else:
            raise ValueError(
                "Either feed_id or feed_name must be defined to get existing feed"
            )

        f.raise_for_status()

        # Capture important properties from the result
        feed = f.json()
        feed_id = feed["feedId"]
        ctx.instance.runtime_properties[
            "feed_id"] = feed_id  # Just to be consistent with newly-created node, above
        ctx.instance.runtime_properties["publish_url"] = feed["publishURL"]
        ctx.instance.runtime_properties["log_url"] = feed["logURL"]
        if feed_id_input:
            ctx.logger.info("Found existing feed with feed id {0}".format(
                ctx.node.properties["feed_id"]))
        else:
            ctx.logger.info("Found existing feed with feed name {0}".format(
                ctx.node.properties["feed_name"]))

    except ValueError as e:
        ctx.logger.error("{er}".format(er=e))
        raise NonRecoverableError(e)
    except Exception as e:
        if feed_id_input:
            ctx.logger.error(
                "Error getting existing feed id {id}: {er}".format(
                    id=ctx.node.properties["feed_id"], er=e))
        else:
            ctx.logger.error(
                "Error getting existing feed name {name}: {er}".format(
                    name=ctx.node.properties["feed_name"], er=e))
        raise NonRecoverableError(e)