예제 #1
0
/*
 * Find the portal for a given portal group
 */
static isns_object_t *
__isns_pg_find_portal(isns_db_t *db, isns_object_t *pg,
                      const isns_object_list_t *extra_objs)
{
    isns_attr_list_t key_attrs = ISNS_ATTR_LIST_INIT;
    isns_object_t	*obj = NULL;

    /* FIXME: ISNS_TAG_PG_PORTAL_IP_ADDR -> ...ADDRESS */
    if (!__isns_object_translate_attr(pg,
                                      ISNS_TAG_PG_PORTAL_IP_ADDR,
                                      ISNS_TAG_PORTAL_IP_ADDRESS,
                                      &key_attrs))
        goto out;
    if (!__isns_object_translate_attr(pg,
                                      ISNS_TAG_PG_PORTAL_TCP_UDP_PORT,
                                      ISNS_TAG_PORTAL_TCP_UDP_PORT,
                                      &key_attrs))
        goto out;

    obj = isns_db_lookup(db, &isns_portal_template, &key_attrs);
    if (!obj && extra_objs)
        obj = isns_object_list_lookup(extra_objs,
                                      &isns_portal_template, &key_attrs);

out:
    isns_attr_list_destroy(&key_attrs);
    return obj;
}
예제 #2
0
파일: local.c 프로젝트: cleech/open-isns
/*
 * Callback function which builds an iSNS object from the
 * list of attr=tag values.
 */
static int
__isns_local_registry_load_object(const char *line,
		int argc, char **argv, void *user_data)
{
	isns_attr_list_t attrs = ISNS_ATTR_LIST_INIT;
	struct isns_attr_list_parser state;
	isns_object_list_t *list = user_data;
	isns_object_t *obj, *entity = NULL;

	for (; argc > 0; --argc) {
		char	*attr = argv[argc-1];

		if (!strncasecmp(attr, "owner=", 6)) {
			char *eid = __isns_local_registry_entity_name(attr + 6);
			ISNS_QUICK_ATTR_LIST_DECLARE(key_attrs,
					ISNS_TAG_ENTITY_IDENTIFIER,
					string, eid);

			if (entity) {
				isns_error("Duplicate owner entry in registry\n");
				continue;
			}
			isns_attr_print(&key_attrs.iqa_attr, isns_print_stdout);
			entity = isns_object_list_lookup(list,
					&isns_entity_template,
					&key_attrs.iqa_list);
			if (entity != NULL)
				continue;

			isns_debug_state("Creating fake entity %s\n", eid);
			entity = isns_create_entity(ISNS_ENTITY_PROTOCOL_ISCSI, eid);
			isns_object_list_append(list, entity);
		} else {
			break;
		}
	}

	isns_attr_list_parser_init(&state, NULL);
	if (!isns_parse_attrs(argc, argv, &attrs, &state)) {
		isns_error("Unable to parse attrs\n");
		isns_attr_list_destroy(&attrs);
		return 0;
	}

	obj = isns_create_object(isns_attr_list_parser_context(&state),
					&attrs, entity);
	isns_attr_list_destroy(&attrs);

	if (obj == NULL) {
		isns_error("Unable to create object\n");
		return 0;
	}

	isns_object_list_append(list, obj);
	return 1;
}
예제 #3
0
/*
 * Find the node for a given portal group
 */
static isns_object_t *
__isns_pg_find_node(isns_db_t *db, isns_object_t *pg,
                    const isns_object_list_t *extra_objs)
{
    isns_attr_list_t key_attrs = ISNS_ATTR_LIST_INIT;
    isns_object_t	*obj = NULL;

    if (!__isns_object_translate_attr(pg,
                                      ISNS_TAG_PG_ISCSI_NAME,
                                      ISNS_TAG_ISCSI_NAME,
                                      &key_attrs))
        goto out;

    obj = isns_db_lookup(db, &isns_iscsi_node_template, &key_attrs);
    if (!obj && extra_objs)
        obj = isns_object_list_lookup(extra_objs,
                                      &isns_iscsi_node_template, &key_attrs);

out:
    isns_attr_list_destroy(&key_attrs);
    return obj;
}