http://git-wip-us.apache.org/repos/asf/celix/blob/a1c30887/pubsub/deploy/CMakeLists.txt ---------------------------------------------------------------------- diff --git a/pubsub/deploy/CMakeLists.txt b/pubsub/deploy/CMakeLists.txt index 5039aea..6f9234d 100644 --- a/pubsub/deploy/CMakeLists.txt +++ b/pubsub/deploy/CMakeLists.txt @@ -22,53 +22,53 @@ find_program(XTERM_CMD NAMES xterm) add_deploy(pubsub_publisher_udp_mc GROUP pubsub BUNDLES - shell - shell_tui - org.apache.celix.pubsub_serializer.PubSubSerializerJson - org.apache.celix.pubsub_discovery.etcd.PubsubDiscovery - org.apache.celix.pubsub_topology_manager.PubSubTopologyManager - org.apache.celix.pubsub_admin.PubSubAdminUdpMc - org.apache.celix.pubsub_publisher.PoiPublisher - org.apache.celix.pubsub_publisher.PoiPublisher2 + Celix::shell + Celix::shell_tui + org.apache.celix.pubsub_serializer.PubSubSerializerJson + org.apache.celix.pubsub_discovery.etcd.PubsubDiscovery + org.apache.celix.pubsub_topology_manager.PubSubTopologyManager + org.apache.celix.pubsub_admin.PubSubAdminUdpMc + org.apache.celix.pubsub_publisher.PoiPublisher + org.apache.celix.pubsub_publisher.PoiPublisher2 ) add_deploy("pubsub_subscriber_udp_mc" GROUP "pubsub" BUNDLES - shell - shell_tui - org.apache.celix.pubsub_serializer.PubSubSerializerJson - org.apache.celix.pubsub_discovery.etcd.PubsubDiscovery - org.apache.celix.pubsub_topology_manager.PubSubTopologyManager - org.apache.celix.pubsub_admin.PubSubAdminUdpMc - org.apache.celix.pubsub_subscriber.PoiSubscriber + Celix::shell + Celix::shell_tui + org.apache.celix.pubsub_serializer.PubSubSerializerJson + org.apache.celix.pubsub_discovery.etcd.PubsubDiscovery + org.apache.celix.pubsub_topology_manager.PubSubTopologyManager + org.apache.celix.pubsub_admin.PubSubAdminUdpMc + org.apache.celix.pubsub_subscriber.PoiSubscriber ) add_deploy("pubsub_subscriber2_udp_mc" GROUP "pubsub" BUNDLES - shell - shell_tui - org.apache.celix.pubsub_serializer.PubSubSerializerJson - org.apache.celix.pubsub_discovery.etcd.PubsubDiscovery - org.apache.celix.pubsub_topology_manager.PubSubTopologyManager - org.apache.celix.pubsub_admin.PubSubAdminUdpMc - org.apache.celix.pubsub_subscriber.PoiSubscriber + Celix::shell + Celix::shell_tui + org.apache.celix.pubsub_serializer.PubSubSerializerJson + org.apache.celix.pubsub_discovery.etcd.PubsubDiscovery + org.apache.celix.pubsub_topology_manager.PubSubTopologyManager + org.apache.celix.pubsub_admin.PubSubAdminUdpMc + org.apache.celix.pubsub_subscriber.PoiSubscriber ) if (ETCD_CMD AND XTERM_CMD) #Runtime starting a publish and subscriber for udp mc add_runtime(pubsub_rt_upd_mc - NAME udp_mc - GROUP pubsub - DEPLOYMENTS + NAME udp_mc + GROUP pubsub + DEPLOYMENTS pubsub_publisher_udp_mc pubsub_subscriber_udp_mc pubsub_subscriber2_udp_mc - COMMANDS + COMMANDS etcd - USE_TERM - ) + USE_TERM + ) endif () if (BUILD_PUBSUB_PSA_ZMQ) @@ -77,61 +77,61 @@ if (BUILD_PUBSUB_PSA_ZMQ) add_deploy("pubsub_publisher" GROUP "pubsub" BUNDLES - shell - shell_tui - org.apache.celix.pubsub_serializer.PubSubSerializerJson - org.apache.celix.pubsub_discovery.etcd.PubsubDiscovery - org.apache.celix.pubsub_topology_manager.PubSubTopologyManager - org.apache.celix.pubsub_admin.PubSubAdminZmq - org.apache.celix.pubsub_admin.PubSubAdminUdpMc - org.apache.celix.pubsub_publisher.PoiPublisher - org.apache.celix.pubsub_publisher.PoiPublisher2 + Celix::shell + Celix::shell_tui + org.apache.celix.pubsub_serializer.PubSubSerializerJson + org.apache.celix.pubsub_discovery.etcd.PubsubDiscovery + org.apache.celix.pubsub_topology_manager.PubSubTopologyManager + org.apache.celix.pubsub_admin.PubSubAdminZmq + org.apache.celix.pubsub_admin.PubSubAdminUdpMc + org.apache.celix.pubsub_publisher.PoiPublisher + org.apache.celix.pubsub_publisher.PoiPublisher2 PROPERTIES - poi1.psa=zmq - poi2.psa=udp + poi1.psa=zmq + poi2.psa=udp ) add_deploy("pubsub_subscriber" GROUP "pubsub" BUNDLES - shell - shell_tui - org.apache.celix.pubsub_serializer.PubSubSerializerJson - org.apache.celix.pubsub_discovery.etcd.PubsubDiscovery - org.apache.celix.pubsub_topology_manager.PubSubTopologyManager - org.apache.celix.pubsub_admin.PubSubAdminZmq - org.apache.celix.pubsub_admin.PubSubAdminUdpMc - org.apache.celix.pubsub_subscriber.PoiSubscriber + Celix::shell + Celix::shell_tui + org.apache.celix.pubsub_serializer.PubSubSerializerJson + org.apache.celix.pubsub_discovery.etcd.PubsubDiscovery + org.apache.celix.pubsub_topology_manager.PubSubTopologyManager + org.apache.celix.pubsub_admin.PubSubAdminZmq + org.apache.celix.pubsub_admin.PubSubAdminUdpMc + org.apache.celix.pubsub_subscriber.PoiSubscriber PROPERTIES - poi1.psa=zmq - poi2.psa=udp + poi1.psa=zmq + poi2.psa=udp ) # ZMQ add_deploy("pubsub_zmq" GROUP "pubsub" BUNDLES - shell - shell_tui - org.apache.celix.pubsub_serializer.PubSubSerializerJson - org.apache.celix.pubsub_discovery.etcd.PubsubDiscovery - org.apache.celix.pubsub_topology_manager.PubSubTopologyManager - org.apache.celix.pubsub_admin.PubSubAdminZmq - org.apache.celix.pubsub_publisher.PoiPublisher - org.apache.celix.pubsub_subscriber.PoiSubscriber + Celix::shell + Celix::shell_tui + org.apache.celix.pubsub_serializer.PubSubSerializerJson + org.apache.celix.pubsub_discovery.etcd.PubsubDiscovery + org.apache.celix.pubsub_topology_manager.PubSubTopologyManager + org.apache.celix.pubsub_admin.PubSubAdminZmq + org.apache.celix.pubsub_publisher.PoiPublisher + org.apache.celix.pubsub_subscriber.PoiSubscriber ) add_deploy("pubsub_publisher_zmq" GROUP "pubsub" BUNDLES - shell - shell_tui - org.apache.celix.pubsub_serializer.PubSubSerializerJson - org.apache.celix.pubsub_discovery.etcd.PubsubDiscovery - org.apache.celix.pubsub_topology_manager.PubSubTopologyManager - org.apache.celix.pubsub_admin.PubSubAdminZmq - org.apache.celix.pubsub_publisher.PoiPublisher - org.apache.celix.pubsub_publisher.PoiPublisher2 + Celix::shell + Celix::shell_tui + org.apache.celix.pubsub_serializer.PubSubSerializerJson + org.apache.celix.pubsub_discovery.etcd.PubsubDiscovery + org.apache.celix.pubsub_topology_manager.PubSubTopologyManager + org.apache.celix.pubsub_admin.PubSubAdminZmq + org.apache.celix.pubsub_publisher.PoiPublisher + org.apache.celix.pubsub_publisher.PoiPublisher2 PROPERTIES pubsub.scope=my_small_scope ) @@ -139,25 +139,25 @@ if (BUILD_PUBSUB_PSA_ZMQ) add_deploy("pubsub_subscriber_zmq" GROUP "pubsub" BUNDLES - shell - shell_tui - org.apache.celix.pubsub_serializer.PubSubSerializerJson - org.apache.celix.pubsub_discovery.etcd.PubsubDiscovery - org.apache.celix.pubsub_topology_manager.PubSubTopologyManager - org.apache.celix.pubsub_admin.PubSubAdminZmq - org.apache.celix.pubsub_subscriber.PoiSubscriber + Celix::shell + Celix::shell_tui + org.apache.celix.pubsub_serializer.PubSubSerializerJson + org.apache.celix.pubsub_discovery.etcd.PubsubDiscovery + org.apache.celix.pubsub_topology_manager.PubSubTopologyManager + org.apache.celix.pubsub_admin.PubSubAdminZmq + org.apache.celix.pubsub_subscriber.PoiSubscriber ) add_deploy("pubsub_subscriber2_zmq" GROUP "pubsub" BUNDLES - shell - shell_tui - org.apache.celix.pubsub_serializer.PubSubSerializerJson - org.apache.celix.pubsub_discovery.etcd.PubsubDiscovery - org.apache.celix.pubsub_topology_manager.PubSubTopologyManager - org.apache.celix.pubsub_admin.PubSubAdminZmq - org.apache.celix.pubsub_subscriber.PoiSubscriber + Celix::shell + Celix::shell_tui + org.apache.celix.pubsub_serializer.PubSubSerializerJson + org.apache.celix.pubsub_discovery.etcd.PubsubDiscovery + org.apache.celix.pubsub_topology_manager.PubSubTopologyManager + org.apache.celix.pubsub_admin.PubSubAdminZmq + org.apache.celix.pubsub_subscriber.PoiSubscriber ) @@ -165,20 +165,20 @@ if (BUILD_PUBSUB_PSA_ZMQ) add_deploy("pubsub_mp_subscriber_zmq" GROUP "pubsub" BUNDLES - shell - shell_tui - org.apache.celix.pubsub_serializer.PubSubSerializerJson - org.apache.celix.pubsub_discovery.etcd.PubsubDiscovery - org.apache.celix.pubsub_topology_manager.PubSubTopologyManager - org.apache.celix.pubsub_admin.PubSubAdminZmq - org.apache.celix.pubsub_subscriber.MpSubscriber + Celix::hell + Celix::shell_tui + org.apache.celix.pubsub_serializer.PubSubSerializerJson + org.apache.celix.pubsub_discovery.etcd.PubsubDiscovery + org.apache.celix.pubsub_topology_manager.PubSubTopologyManager + org.apache.celix.pubsub_admin.PubSubAdminZmq + org.apache.celix.pubsub_subscriber.MpSubscriber ) add_deploy("pubsub_mp_publisher_zmq" GROUP "pubsub" BUNDLES - shell - shell_tui + Celix::shell + Celix::shell_tui org.apache.celix.pubsub_serializer.PubSubSerializerJson org.apache.celix.pubsub_discovery.etcd.PubsubDiscovery org.apache.celix.pubsub_topology_manager.PubSubTopologyManager
http://git-wip-us.apache.org/repos/asf/celix/blob/a1c30887/remote_services/CMakeLists.txt ---------------------------------------------------------------------- diff --git a/remote_services/CMakeLists.txt b/remote_services/CMakeLists.txt index d5d07a3..767ece7 100644 --- a/remote_services/CMakeLists.txt +++ b/remote_services/CMakeLists.txt @@ -17,17 +17,6 @@ celix_subproject(REMOTE_SERVICE_ADMIN "Option to enable building the Remote Service Admin Service bundles" OFF) if (REMOTE_SERVICE_ADMIN) - # Add -fPIC for x86_64 Unix platforms; this lib will be linked to a shared lib - if(UNIX AND NOT WIN32) - find_program(CMAKE_UNAME uname /bin /usr/bin /usr/local/bin ) - if(CMAKE_UNAME) - exec_program(uname ARGS -m OUTPUT_VARIABLE CMAKE_SYSTEM_PROCESSOR) - set(CMAKE_SYSTEM_PROCESSOR ${CMAKE_SYSTEM_PROCESSOR} CACHE INTERNAL "processor type (i386 and x86_64)") - if(CMAKE_SYSTEM_PROCESSOR MATCHES "x86_64") - add_definitions(-fPIC) - endif(CMAKE_SYSTEM_PROCESSOR MATCHES "x86_64") - endif(CMAKE_UNAME) - endif(UNIX AND NOT WIN32) add_subdirectory(examples) @@ -37,8 +26,8 @@ if (REMOTE_SERVICE_ADMIN) add_subdirectory(discovery_etcd) add_subdirectory(discovery_shm) - add_subdirectory(remote_service_admin_http) - add_subdirectory(remote_service_admin_shm) + #TODO refactor shm rsa to use dfi + #add_subdirectory(remote_service_admin_shm) add_subdirectory(remote_service_admin) add_subdirectory(remote_service_admin_dfi) http://git-wip-us.apache.org/repos/asf/celix/blob/a1c30887/remote_services/discovery_configured/CMakeLists.txt ---------------------------------------------------------------------- diff --git a/remote_services/discovery_configured/CMakeLists.txt b/remote_services/discovery_configured/CMakeLists.txt index edbbc13..b9f849d 100644 --- a/remote_services/discovery_configured/CMakeLists.txt +++ b/remote_services/discovery_configured/CMakeLists.txt @@ -46,13 +46,12 @@ if (RSA_DISCOVERY_CONFIGURED) ${PROJECT_SOURCE_DIR}/remote_services/discovery/private/src/endpoint_discovery_server.c ${PROJECT_SOURCE_DIR}/remote_services/remote_service_admin/private/src/endpoint_description.c ${PROJECT_SOURCE_DIR}/remote_services/utils/private/src/civetweb.c - - ${PROJECT_SOURCE_DIR}/log_service/public/src/log_helper.c ) + target_link_libraries(discovery_configured PRIVATE Celix::log_helper) install_bundle(discovery_configured) - target_link_libraries(discovery_configured celix_framework ${CURL_LIBRARIES} ${LIBXML2_LIBRARIES}) + target_link_libraries(discovery_configured PRIVATE ${CURL_LIBRARIES} ${LIBXML2_LIBRARIES}) if (RSA_ENDPOINT_TEST_READER) add_executable(descparser http://git-wip-us.apache.org/repos/asf/celix/blob/a1c30887/remote_services/discovery_etcd/CMakeLists.txt ---------------------------------------------------------------------- diff --git a/remote_services/discovery_etcd/CMakeLists.txt b/remote_services/discovery_etcd/CMakeLists.txt index 442d486..b8955de 100644 --- a/remote_services/discovery_etcd/CMakeLists.txt +++ b/remote_services/discovery_etcd/CMakeLists.txt @@ -40,8 +40,8 @@ if (RSA_DISCOVERY_ETCD) SYMBOLIC_NAME "apache_celix_rsa_discovery_etcd" NAME "Apache Celix RSA Discovery ETCD" SOURCES - private/src/discovery_impl.c - private/src/etcd_watcher.c + src/discovery_impl.c + src/etcd_watcher.c ${PROJECT_SOURCE_DIR}/remote_services/discovery/private/src/discovery_activator.c ${PROJECT_SOURCE_DIR}/remote_services/discovery/private/src/discovery.c ${PROJECT_SOURCE_DIR}/remote_services/discovery/private/src/endpoint_descriptor_reader.c @@ -50,12 +50,12 @@ if (RSA_DISCOVERY_ETCD) ${PROJECT_SOURCE_DIR}/remote_services/discovery/private/src/endpoint_discovery_server.c ${PROJECT_SOURCE_DIR}/remote_services/remote_service_admin/private/src/endpoint_description.c ${PROJECT_SOURCE_DIR}/remote_services/utils/private/src/civetweb.c - - ${PROJECT_SOURCE_DIR}/log_service/public/src/log_helper.c ) + target_link_libraries(discovery_etcd PRIVATE Celix::log_helper) + target_include_directories(discovery_etcd PRIVATE src ../discovery/private/include) install_bundle(discovery_etcd) - target_link_libraries(discovery_etcd celix_framework etcdlib ${CURL_LIBRARIES} ${LIBXML2_LIBRARIES} ${JANSSON_LIBRARIES}) + target_link_libraries(discovery_etcd PRIVATE Celix::etcdlib ${CURL_LIBRARIES} ${LIBXML2_LIBRARIES} ${JANSSON_LIBRARIES}) endif (RSA_DISCOVERY_ETCD) http://git-wip-us.apache.org/repos/asf/celix/blob/a1c30887/remote_services/discovery_etcd/private/include/discovery_impl.h ---------------------------------------------------------------------- diff --git a/remote_services/discovery_etcd/private/include/discovery_impl.h b/remote_services/discovery_etcd/private/include/discovery_impl.h deleted file mode 100644 index a19b145..0000000 --- a/remote_services/discovery_etcd/private/include/discovery_impl.h +++ /dev/null @@ -1,66 +0,0 @@ -/** - *Licensed to the Apache Software Foundation (ASF) under one - *or more contributor license agreements. See the NOTICE file - *distributed with this work for additional information - *regarding copyright ownership. The ASF licenses this file - *to you under the Apache License, Version 2.0 (the - *"License"); you may not use this file except in compliance - *with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - *Unless required by applicable law or agreed to in writing, - *software distributed under the License is distributed on an - *"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - *specific language governing permissions and limitations - *under the License. - */ -/* - * discovery_impl.h - * - * \date Sep 29, 2011 - * \author <a href="mailto:[email protected]">Apache Celix Project Team</a> - * \copyright Apache License, Version 2.0 - */ - -#ifndef DISCOVERY_IMPL_H_ -#define DISCOVERY_IMPL_H_ - -#include "bundle_context.h" -#include "service_reference.h" - -#include "endpoint_description.h" -#include "endpoint_listener.h" - -#include "endpoint_discovery_poller.h" -#include "endpoint_discovery_server.h" -#include "etcd_watcher.h" - -#include "log_helper.h" - -#define DEFAULT_SERVER_IP "127.0.0.1" -#define DEFAULT_SERVER_PORT "9999" -#define DEFAULT_SERVER_PATH "/org.apache.celix.discovery.etcd" - -#define DEFAULT_POLL_ENDPOINTS "" - -#define FREE_MEM(ptr) if(ptr) {free(ptr); ptr = NULL;} - -struct discovery { - bundle_context_pt context; - - celix_thread_mutex_t listenerReferencesMutex; - celix_thread_mutex_t discoveredServicesMutex; - - hash_map_pt listenerReferences; //key=serviceReference, value=nop - hash_map_pt discoveredServices; //key=endpointId (string), value=endpoint_description_pt - - etcd_watcher_pt watcher; - endpoint_discovery_poller_pt poller; - endpoint_discovery_server_pt server; - - log_helper_pt loghelper; -}; - -#endif /* DISCOVERY_H_ */ http://git-wip-us.apache.org/repos/asf/celix/blob/a1c30887/remote_services/discovery_etcd/private/include/etcd_watcher.h ---------------------------------------------------------------------- diff --git a/remote_services/discovery_etcd/private/include/etcd_watcher.h b/remote_services/discovery_etcd/private/include/etcd_watcher.h deleted file mode 100644 index b4dbf40..0000000 --- a/remote_services/discovery_etcd/private/include/etcd_watcher.h +++ /dev/null @@ -1,40 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -/* - * etcd_watcher.h - * - * \date 17 Sep 2014 - * \author <a href="mailto:[email protected]">Apache Celix Project Team</a> - * \copyright Apache License, Version 2.0 - */ - -#ifndef ETCD_WATCHER_H_ -#define ETCD_WATCHER_H_ - -#include "celix_errno.h" -#include "discovery.h" -#include "endpoint_discovery_poller.h" - -typedef struct etcd_watcher *etcd_watcher_pt; - -celix_status_t etcdWatcher_create(discovery_pt discovery, bundle_context_pt context, etcd_watcher_pt *watcher); -celix_status_t etcdWatcher_destroy(etcd_watcher_pt watcher); - - -#endif /* ETCD_WATCHER_H_ */ http://git-wip-us.apache.org/repos/asf/celix/blob/a1c30887/remote_services/discovery_etcd/private/src/discovery_impl.c ---------------------------------------------------------------------- diff --git a/remote_services/discovery_etcd/private/src/discovery_impl.c b/remote_services/discovery_etcd/private/src/discovery_impl.c deleted file mode 100644 index 8087d95..0000000 --- a/remote_services/discovery_etcd/private/src/discovery_impl.c +++ /dev/null @@ -1,183 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -/* - * discovery_impl.c - * - * \date Aug 8, 2014 - * \author <a href="mailto:[email protected]">Apache Celix Project Team</a> - * \copyright Apache License, Version 2.0 - */ -#include <stdio.h> -#include <stdlib.h> -#include <unistd.h> -#include <stdbool.h> -#include <netdb.h> -#include <netinet/in.h> - -#include "constants.h" -#include "celix_threads.h" -#include "bundle_context.h" -#include "array_list.h" -#include "utils.h" -#include "celix_errno.h" -#include "filter.h" -#include "service_reference.h" -#include "service_registration.h" -#include "remote_constants.h" - - -#include "discovery.h" -#include "discovery_impl.h" -#include "etcd_watcher.h" -#include "endpoint_discovery_poller.h" -#include "endpoint_discovery_server.h" - - - -celix_status_t discovery_create(bundle_context_pt context, discovery_pt *discovery) { - celix_status_t status = CELIX_SUCCESS; - - *discovery = malloc(sizeof(struct discovery)); - if (!*discovery) { - return CELIX_ENOMEM; - } - - (*discovery)->context = context; - (*discovery)->poller = NULL; - (*discovery)->server = NULL; - - (*discovery)->listenerReferences = hashMap_create(serviceReference_hashCode, NULL, serviceReference_equals2, NULL); - (*discovery)->discoveredServices = hashMap_create(utils_stringHash, NULL, utils_stringEquals, NULL); - - status = celixThreadMutex_create(&(*discovery)->listenerReferencesMutex, NULL); - status = celixThreadMutex_create(&(*discovery)->discoveredServicesMutex, NULL); - - logHelper_create(context, &(*discovery)->loghelper); - - return status; -} - - - -celix_status_t discovery_destroy(discovery_pt discovery) { - celix_status_t status = CELIX_SUCCESS; - - discovery->context = NULL; - discovery->poller = NULL; - discovery->server = NULL; - - celixThreadMutex_lock(&discovery->discoveredServicesMutex); - - hashMap_destroy(discovery->discoveredServices, false, false); - discovery->discoveredServices = NULL; - - celixThreadMutex_unlock(&discovery->discoveredServicesMutex); - - celixThreadMutex_destroy(&discovery->discoveredServicesMutex); - - celixThreadMutex_lock(&discovery->listenerReferencesMutex); - - hashMap_destroy(discovery->listenerReferences, false, false); - discovery->listenerReferences = NULL; - - celixThreadMutex_unlock(&discovery->listenerReferencesMutex); - - celixThreadMutex_destroy(&discovery->listenerReferencesMutex); - - logHelper_destroy(&discovery->loghelper); - - free(discovery); - - return status; -} - -celix_status_t discovery_start(discovery_pt discovery) { - celix_status_t status = CELIX_SUCCESS; - const char *port = NULL; - const char *path = NULL; - - logHelper_start(discovery->loghelper); - - bundleContext_getProperty(discovery->context, DISCOVERY_SERVER_PORT, &port); - if (port == NULL) { - port = DEFAULT_SERVER_PORT; - } - - bundleContext_getProperty(discovery->context, DISCOVERY_SERVER_PATH, &path); - if (path == NULL) { - path = DEFAULT_SERVER_PATH; - } - - status = endpointDiscoveryPoller_create(discovery, discovery->context, &discovery->poller); - if (status != CELIX_SUCCESS) { - return CELIX_BUNDLE_EXCEPTION; - } - - status = endpointDiscoveryServer_create(discovery, discovery->context, &discovery->server); - if (status != CELIX_SUCCESS) { - return CELIX_BUNDLE_EXCEPTION; - } - - status = etcdWatcher_create(discovery, discovery->context, &discovery->watcher); - if (status != CELIX_SUCCESS) { - return CELIX_BUNDLE_EXCEPTION; - } - return status; -} - -celix_status_t discovery_stop(discovery_pt discovery) { - celix_status_t status; - - status = etcdWatcher_destroy(discovery->watcher); - if (status != CELIX_SUCCESS) { - return CELIX_BUNDLE_EXCEPTION; - } - - status = endpointDiscoveryServer_destroy(discovery->server); - if (status != CELIX_SUCCESS) { - return CELIX_BUNDLE_EXCEPTION; - } - - status = endpointDiscoveryPoller_destroy(discovery->poller); - if (status != CELIX_SUCCESS) { - return CELIX_BUNDLE_EXCEPTION; - } - hash_map_iterator_pt iter; - - celixThreadMutex_lock(&discovery->discoveredServicesMutex); - - iter = hashMapIterator_create(discovery->discoveredServices); - while (hashMapIterator_hasNext(iter)) { - hash_map_entry_pt entry = hashMapIterator_nextEntry(iter); - endpoint_description_pt endpoint = hashMapEntry_getValue(entry); - - discovery_informEndpointListeners(discovery, endpoint, false); - } - hashMapIterator_destroy(iter); - - celixThreadMutex_unlock(&discovery->discoveredServicesMutex); - - - logHelper_stop(discovery->loghelper); - - return status; -} - - - http://git-wip-us.apache.org/repos/asf/celix/blob/a1c30887/remote_services/discovery_etcd/private/src/etcd_watcher.c ---------------------------------------------------------------------- diff --git a/remote_services/discovery_etcd/private/src/etcd_watcher.c b/remote_services/discovery_etcd/private/src/etcd_watcher.c deleted file mode 100644 index ebeac4f..0000000 --- a/remote_services/discovery_etcd/private/src/etcd_watcher.c +++ /dev/null @@ -1,397 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -/* - * etcd_watcher.c - * - * \date 16 Sep 2014 - * \author <a href="mailto:[email protected]">Apache Celix Project Team</a> - * \copyright Apache License, Version 2.0 - */ - -#include <stdbool.h> -#include <stdlib.h> -#include <unistd.h> -#include <string.h> - -#include "log_helper.h" -#include "log_service.h" -#include "constants.h" -#include "utils.h" -#include "discovery.h" -#include "discovery_impl.h" - -#include <curl/curl.h> -#include "etcd.h" -#include "etcd_watcher.h" - -#include "endpoint_discovery_poller.h" - -struct etcd_watcher { - discovery_pt discovery; - log_helper_pt* loghelper; - hash_map_pt entries; - - celix_thread_mutex_t watcherLock; - celix_thread_t watcherThread; - - volatile bool running; -}; - - -#define MAX_ROOTNODE_LENGTH 128 -#define MAX_LOCALNODE_LENGTH 4096 -#define MAX_VALUE_LENGTH 256 - -#define CFG_ETCD_ROOT_PATH "DISCOVERY_ETCD_ROOT_PATH" -#define DEFAULT_ETCD_ROOTPATH "discovery" - -#define CFG_ETCD_SERVER_IP "DISCOVERY_ETCD_SERVER_IP" -#define DEFAULT_ETCD_SERVER_IP "127.0.0.1" - -#define CFG_ETCD_SERVER_PORT "DISCOVERY_ETCD_SERVER_PORT" -#define DEFAULT_ETCD_SERVER_PORT 2379 - -// be careful - this should be higher than the curl timeout -#define CFG_ETCD_TTL "DISCOVERY_ETCD_TTL" -#define DEFAULT_ETCD_TTL 30 - - -// note that the rootNode shouldn't have a leading slash -static celix_status_t etcdWatcher_getRootPath(bundle_context_pt context, char* rootNode) { - celix_status_t status = CELIX_SUCCESS; - const char* rootPath = NULL; - - if (((bundleContext_getProperty(context, CFG_ETCD_ROOT_PATH, &rootPath)) != CELIX_SUCCESS) || (!rootPath)) { - strncpy(rootNode, DEFAULT_ETCD_ROOTPATH, MAX_ROOTNODE_LENGTH); - } - else { - strncpy(rootNode, rootPath, MAX_ROOTNODE_LENGTH); - } - - return status; -} - -static celix_status_t etcdWatcher_getLocalNodePath(bundle_context_pt context, char* localNodePath) { - celix_status_t status = CELIX_SUCCESS; - char rootPath[MAX_ROOTNODE_LENGTH]; - const char* uuid = NULL; - - if ((etcdWatcher_getRootPath(context, rootPath) != CELIX_SUCCESS)) { - status = CELIX_ILLEGAL_STATE; - } - else if (((bundleContext_getProperty(context, OSGI_FRAMEWORK_FRAMEWORK_UUID, &uuid)) != CELIX_SUCCESS) || (!uuid)) { - status = CELIX_ILLEGAL_STATE; - } - else if (rootPath[strlen(rootPath) - 1] == '/') { - snprintf(localNodePath, MAX_LOCALNODE_LENGTH, "%s%s", rootPath, uuid); - } - else { - snprintf(localNodePath, MAX_LOCALNODE_LENGTH, "%s/%s", rootPath, uuid); - } - - return status; -} - -static void add_node(const char *key, const char *value, void* arg) { - discovery_pt discovery = (discovery_pt) arg; - endpointDiscoveryPoller_addDiscoveryEndpoint(discovery->poller, (char *) value); -} - -/* - * retrieves all already existing discovery endpoints - * from etcd and adds them to the poller. - * - * returns the modifiedIndex of the last modified - * discovery endpoint (see etcd documentation). - */ -static celix_status_t etcdWatcher_addAlreadyExistingWatchpoints(discovery_pt discovery, long long* highestModified) { - celix_status_t status = CELIX_SUCCESS; - - char rootPath[MAX_ROOTNODE_LENGTH]; - status = etcdWatcher_getRootPath(discovery->context, rootPath); - - if (status == CELIX_SUCCESS) { - if(etcd_get_directory(rootPath, add_node, discovery, highestModified)) { - status = CELIX_ILLEGAL_ARGUMENT; - } - } - - return status; -} - - -static celix_status_t etcdWatcher_addOwnFramework(etcd_watcher_pt watcher) -{ - celix_status_t status = CELIX_BUNDLE_EXCEPTION; - char localNodePath[MAX_LOCALNODE_LENGTH]; - char *value; - char url[MAX_VALUE_LENGTH]; - int modIndex; - char* endpoints = NULL; - const char* ttlStr = NULL; - int ttl; - - bundle_context_pt context = watcher->discovery->context; - endpoint_discovery_server_pt server = watcher->discovery->server; - - // register own framework - if ((status = etcdWatcher_getLocalNodePath(context, localNodePath)) != CELIX_SUCCESS) { - return status; - } - - if (endpointDiscoveryServer_getUrl(server, url) != CELIX_SUCCESS) { - snprintf(url, MAX_VALUE_LENGTH, "http://%s:%s/%s", DEFAULT_SERVER_IP, DEFAULT_SERVER_PORT, DEFAULT_SERVER_PATH); - } - - endpoints = url; - - if ((bundleContext_getProperty(context, CFG_ETCD_TTL, &ttlStr) != CELIX_SUCCESS) || !ttlStr) { - ttl = DEFAULT_ETCD_TTL; - } - else - { - char* endptr = (char *) ttlStr; - errno = 0; - ttl = strtol(ttlStr, &endptr, 10); - if (*endptr || errno != 0) { - ttl = DEFAULT_ETCD_TTL; - } - } - - if (etcd_get(localNodePath, &value, &modIndex) != true) { - etcd_set(localNodePath, endpoints, ttl, false); - } - else if (etcd_set(localNodePath, endpoints, ttl, true) == false) { - logHelper_log(*watcher->loghelper, OSGI_LOGSERVICE_WARNING, "Cannot register local discovery"); - } - else { - status = CELIX_SUCCESS; - } - - FREE_MEM(value); - - return status; -} - - - - -static celix_status_t etcdWatcher_addEntry(etcd_watcher_pt watcher, char* key, char* value) { - celix_status_t status = CELIX_BUNDLE_EXCEPTION; - endpoint_discovery_poller_pt poller = watcher->discovery->poller; - - if (!hashMap_containsKey(watcher->entries, key)) { - status = endpointDiscoveryPoller_addDiscoveryEndpoint(poller, value); - - if (status == CELIX_SUCCESS) { - hashMap_put(watcher->entries, strdup(key), strdup(value)); - } - } - - return status; -} - -static celix_status_t etcdWatcher_removeEntry(etcd_watcher_pt watcher, char* key, char* value) { - celix_status_t status = CELIX_BUNDLE_EXCEPTION; - endpoint_discovery_poller_pt poller = watcher->discovery->poller; - - hash_map_entry_pt entry = hashMap_getEntry(watcher->entries, key); - - if (entry != NULL) { - void* origKey = hashMapEntry_getKey(entry); - void* value = hashMap_remove(watcher->entries, key); - - free(origKey); - - // check if there is another entry with the same value - hash_map_iterator_pt iter = hashMapIterator_create(watcher->entries); - unsigned int valueFound = 0; - - while (hashMapIterator_hasNext(iter) && valueFound <= 1) { - if (strcmp(value, hashMapIterator_nextValue(iter)) == 0) - valueFound++; - } - - hashMapIterator_destroy(iter); - - if (valueFound == 0) - status = endpointDiscoveryPoller_removeDiscoveryEndpoint(poller, value); - - free(value); - - } - - return status; - -} - - -/* - * performs (blocking) etcd_watch calls to check for - * changing discovery endpoint information within etcd. - */ -static void* etcdWatcher_run(void* data) { - etcd_watcher_pt watcher = (etcd_watcher_pt) data; - time_t timeBeforeWatch = time(NULL); - char rootPath[MAX_ROOTNODE_LENGTH]; - long long highestModified = 0; - - bundle_context_pt context = watcher->discovery->context; - - etcdWatcher_addAlreadyExistingWatchpoints(watcher->discovery, &highestModified); - etcdWatcher_getRootPath(context, rootPath); - - while (watcher->running) { - - char *rkey = NULL; - char *value = NULL; - char *preValue = NULL; - char *action = NULL; - long long modIndex; - - if (etcd_watch(rootPath, highestModified + 1, &action, &preValue, &value, &rkey, &modIndex) == 0 && action != NULL) { - if (strcmp(action, "set") == 0) { - etcdWatcher_addEntry(watcher, rkey, value); - } else if (strcmp(action, "delete") == 0) { - etcdWatcher_removeEntry(watcher, rkey, value); - } else if (strcmp(action, "expire") == 0) { - etcdWatcher_removeEntry(watcher, rkey, value); - } else if (strcmp(action, "update") == 0) { - etcdWatcher_addEntry(watcher, rkey, value); - } else { - logHelper_log(*watcher->loghelper, OSGI_LOGSERVICE_INFO, "Unexpected action: %s", action); - } - - highestModified = modIndex; - } else if (time(NULL) - timeBeforeWatch <= (DEFAULT_ETCD_TTL / 4)) { - sleep(DEFAULT_ETCD_TTL / 4); - } - - FREE_MEM(action); - FREE_MEM(value); - FREE_MEM(preValue); - FREE_MEM(rkey); - - // update own framework uuid - if (time(NULL) - timeBeforeWatch > (DEFAULT_ETCD_TTL / 4)) { - etcdWatcher_addOwnFramework(watcher); - timeBeforeWatch = time(NULL); - } - } - - return NULL; -} - -/* - * the ectdWatcher needs to have access to the endpoint_discovery_poller and therefore is only - * allowed to be created after the endpoint_discovery_poller - */ -celix_status_t etcdWatcher_create(discovery_pt discovery, bundle_context_pt context, - etcd_watcher_pt *watcher) -{ - celix_status_t status = CELIX_SUCCESS; - - const char* etcd_server = NULL; - const char* etcd_port_string = NULL; - int etcd_port = 0; - - if (discovery == NULL) { - return CELIX_BUNDLE_EXCEPTION; - } - - (*watcher) = calloc(1, sizeof(struct etcd_watcher)); - if (!*watcher) { - return CELIX_ENOMEM; - } - else - { - (*watcher)->discovery = discovery; - (*watcher)->loghelper = &discovery->loghelper; - (*watcher)->entries = hashMap_create(utils_stringHash, NULL, utils_stringEquals, NULL); - } - - if ((bundleContext_getProperty(context, CFG_ETCD_SERVER_IP, &etcd_server) != CELIX_SUCCESS) || !etcd_server) { - etcd_server = DEFAULT_ETCD_SERVER_IP; - } - - if ((bundleContext_getProperty(context, CFG_ETCD_SERVER_PORT, &etcd_port_string) != CELIX_SUCCESS) || !etcd_port_string) { - etcd_port = DEFAULT_ETCD_SERVER_PORT; - } - else - { - char* endptr = (char*)etcd_port_string; - errno = 0; - etcd_port = strtol(etcd_port_string, &endptr, 10); - if (*endptr || errno != 0) { - etcd_port = DEFAULT_ETCD_SERVER_PORT; - } - } - - if (etcd_init((char*) etcd_server, etcd_port, CURL_GLOBAL_DEFAULT) != 0) { - status = CELIX_BUNDLE_EXCEPTION; - } else { - status = CELIX_SUCCESS; - } - - if (status == CELIX_SUCCESS) { - etcdWatcher_addOwnFramework(*watcher); - status = celixThreadMutex_create(&(*watcher)->watcherLock, NULL); - } - - if (status == CELIX_SUCCESS) { - if (celixThreadMutex_lock(&(*watcher)->watcherLock) == CELIX_SUCCESS) { - status = celixThread_create(&(*watcher)->watcherThread, NULL, etcdWatcher_run, *watcher); - if (status == CELIX_SUCCESS) { - (*watcher)->running = true; - } - celixThreadMutex_unlock(&(*watcher)->watcherLock); - } - } - - return status; -} - - -celix_status_t etcdWatcher_destroy(etcd_watcher_pt watcher) { - celix_status_t status = CELIX_SUCCESS; - char localNodePath[MAX_LOCALNODE_LENGTH]; - - celixThreadMutex_lock(&watcher->watcherLock); - watcher->running = false; - celixThreadMutex_unlock(&watcher->watcherLock); - - celixThread_join(watcher->watcherThread, NULL); - - // register own framework - status = etcdWatcher_getLocalNodePath(watcher->discovery->context, localNodePath); - - if (status != CELIX_SUCCESS || etcd_del(localNodePath) == false) - { - logHelper_log(*watcher->loghelper, OSGI_LOGSERVICE_WARNING, "Cannot remove local discovery registration."); - } - - watcher->loghelper = NULL; - - hashMap_destroy(watcher->entries, true, true); - - free(watcher); - - return status; -} - http://git-wip-us.apache.org/repos/asf/celix/blob/a1c30887/remote_services/discovery_etcd/src/discovery_impl.c ---------------------------------------------------------------------- diff --git a/remote_services/discovery_etcd/src/discovery_impl.c b/remote_services/discovery_etcd/src/discovery_impl.c new file mode 100644 index 0000000..8087d95 --- /dev/null +++ b/remote_services/discovery_etcd/src/discovery_impl.c @@ -0,0 +1,183 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +/* + * discovery_impl.c + * + * \date Aug 8, 2014 + * \author <a href="mailto:[email protected]">Apache Celix Project Team</a> + * \copyright Apache License, Version 2.0 + */ +#include <stdio.h> +#include <stdlib.h> +#include <unistd.h> +#include <stdbool.h> +#include <netdb.h> +#include <netinet/in.h> + +#include "constants.h" +#include "celix_threads.h" +#include "bundle_context.h" +#include "array_list.h" +#include "utils.h" +#include "celix_errno.h" +#include "filter.h" +#include "service_reference.h" +#include "service_registration.h" +#include "remote_constants.h" + + +#include "discovery.h" +#include "discovery_impl.h" +#include "etcd_watcher.h" +#include "endpoint_discovery_poller.h" +#include "endpoint_discovery_server.h" + + + +celix_status_t discovery_create(bundle_context_pt context, discovery_pt *discovery) { + celix_status_t status = CELIX_SUCCESS; + + *discovery = malloc(sizeof(struct discovery)); + if (!*discovery) { + return CELIX_ENOMEM; + } + + (*discovery)->context = context; + (*discovery)->poller = NULL; + (*discovery)->server = NULL; + + (*discovery)->listenerReferences = hashMap_create(serviceReference_hashCode, NULL, serviceReference_equals2, NULL); + (*discovery)->discoveredServices = hashMap_create(utils_stringHash, NULL, utils_stringEquals, NULL); + + status = celixThreadMutex_create(&(*discovery)->listenerReferencesMutex, NULL); + status = celixThreadMutex_create(&(*discovery)->discoveredServicesMutex, NULL); + + logHelper_create(context, &(*discovery)->loghelper); + + return status; +} + + + +celix_status_t discovery_destroy(discovery_pt discovery) { + celix_status_t status = CELIX_SUCCESS; + + discovery->context = NULL; + discovery->poller = NULL; + discovery->server = NULL; + + celixThreadMutex_lock(&discovery->discoveredServicesMutex); + + hashMap_destroy(discovery->discoveredServices, false, false); + discovery->discoveredServices = NULL; + + celixThreadMutex_unlock(&discovery->discoveredServicesMutex); + + celixThreadMutex_destroy(&discovery->discoveredServicesMutex); + + celixThreadMutex_lock(&discovery->listenerReferencesMutex); + + hashMap_destroy(discovery->listenerReferences, false, false); + discovery->listenerReferences = NULL; + + celixThreadMutex_unlock(&discovery->listenerReferencesMutex); + + celixThreadMutex_destroy(&discovery->listenerReferencesMutex); + + logHelper_destroy(&discovery->loghelper); + + free(discovery); + + return status; +} + +celix_status_t discovery_start(discovery_pt discovery) { + celix_status_t status = CELIX_SUCCESS; + const char *port = NULL; + const char *path = NULL; + + logHelper_start(discovery->loghelper); + + bundleContext_getProperty(discovery->context, DISCOVERY_SERVER_PORT, &port); + if (port == NULL) { + port = DEFAULT_SERVER_PORT; + } + + bundleContext_getProperty(discovery->context, DISCOVERY_SERVER_PATH, &path); + if (path == NULL) { + path = DEFAULT_SERVER_PATH; + } + + status = endpointDiscoveryPoller_create(discovery, discovery->context, &discovery->poller); + if (status != CELIX_SUCCESS) { + return CELIX_BUNDLE_EXCEPTION; + } + + status = endpointDiscoveryServer_create(discovery, discovery->context, &discovery->server); + if (status != CELIX_SUCCESS) { + return CELIX_BUNDLE_EXCEPTION; + } + + status = etcdWatcher_create(discovery, discovery->context, &discovery->watcher); + if (status != CELIX_SUCCESS) { + return CELIX_BUNDLE_EXCEPTION; + } + return status; +} + +celix_status_t discovery_stop(discovery_pt discovery) { + celix_status_t status; + + status = etcdWatcher_destroy(discovery->watcher); + if (status != CELIX_SUCCESS) { + return CELIX_BUNDLE_EXCEPTION; + } + + status = endpointDiscoveryServer_destroy(discovery->server); + if (status != CELIX_SUCCESS) { + return CELIX_BUNDLE_EXCEPTION; + } + + status = endpointDiscoveryPoller_destroy(discovery->poller); + if (status != CELIX_SUCCESS) { + return CELIX_BUNDLE_EXCEPTION; + } + hash_map_iterator_pt iter; + + celixThreadMutex_lock(&discovery->discoveredServicesMutex); + + iter = hashMapIterator_create(discovery->discoveredServices); + while (hashMapIterator_hasNext(iter)) { + hash_map_entry_pt entry = hashMapIterator_nextEntry(iter); + endpoint_description_pt endpoint = hashMapEntry_getValue(entry); + + discovery_informEndpointListeners(discovery, endpoint, false); + } + hashMapIterator_destroy(iter); + + celixThreadMutex_unlock(&discovery->discoveredServicesMutex); + + + logHelper_stop(discovery->loghelper); + + return status; +} + + + http://git-wip-us.apache.org/repos/asf/celix/blob/a1c30887/remote_services/discovery_etcd/src/discovery_impl.h ---------------------------------------------------------------------- diff --git a/remote_services/discovery_etcd/src/discovery_impl.h b/remote_services/discovery_etcd/src/discovery_impl.h new file mode 100644 index 0000000..a19b145 --- /dev/null +++ b/remote_services/discovery_etcd/src/discovery_impl.h @@ -0,0 +1,66 @@ +/** + *Licensed to the Apache Software Foundation (ASF) under one + *or more contributor license agreements. See the NOTICE file + *distributed with this work for additional information + *regarding copyright ownership. The ASF licenses this file + *to you under the Apache License, Version 2.0 (the + *"License"); you may not use this file except in compliance + *with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + *Unless required by applicable law or agreed to in writing, + *software distributed under the License is distributed on an + *"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + *specific language governing permissions and limitations + *under the License. + */ +/* + * discovery_impl.h + * + * \date Sep 29, 2011 + * \author <a href="mailto:[email protected]">Apache Celix Project Team</a> + * \copyright Apache License, Version 2.0 + */ + +#ifndef DISCOVERY_IMPL_H_ +#define DISCOVERY_IMPL_H_ + +#include "bundle_context.h" +#include "service_reference.h" + +#include "endpoint_description.h" +#include "endpoint_listener.h" + +#include "endpoint_discovery_poller.h" +#include "endpoint_discovery_server.h" +#include "etcd_watcher.h" + +#include "log_helper.h" + +#define DEFAULT_SERVER_IP "127.0.0.1" +#define DEFAULT_SERVER_PORT "9999" +#define DEFAULT_SERVER_PATH "/org.apache.celix.discovery.etcd" + +#define DEFAULT_POLL_ENDPOINTS "" + +#define FREE_MEM(ptr) if(ptr) {free(ptr); ptr = NULL;} + +struct discovery { + bundle_context_pt context; + + celix_thread_mutex_t listenerReferencesMutex; + celix_thread_mutex_t discoveredServicesMutex; + + hash_map_pt listenerReferences; //key=serviceReference, value=nop + hash_map_pt discoveredServices; //key=endpointId (string), value=endpoint_description_pt + + etcd_watcher_pt watcher; + endpoint_discovery_poller_pt poller; + endpoint_discovery_server_pt server; + + log_helper_pt loghelper; +}; + +#endif /* DISCOVERY_H_ */ http://git-wip-us.apache.org/repos/asf/celix/blob/a1c30887/remote_services/discovery_etcd/src/etcd_watcher.c ---------------------------------------------------------------------- diff --git a/remote_services/discovery_etcd/src/etcd_watcher.c b/remote_services/discovery_etcd/src/etcd_watcher.c new file mode 100644 index 0000000..ebeac4f --- /dev/null +++ b/remote_services/discovery_etcd/src/etcd_watcher.c @@ -0,0 +1,397 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +/* + * etcd_watcher.c + * + * \date 16 Sep 2014 + * \author <a href="mailto:[email protected]">Apache Celix Project Team</a> + * \copyright Apache License, Version 2.0 + */ + +#include <stdbool.h> +#include <stdlib.h> +#include <unistd.h> +#include <string.h> + +#include "log_helper.h" +#include "log_service.h" +#include "constants.h" +#include "utils.h" +#include "discovery.h" +#include "discovery_impl.h" + +#include <curl/curl.h> +#include "etcd.h" +#include "etcd_watcher.h" + +#include "endpoint_discovery_poller.h" + +struct etcd_watcher { + discovery_pt discovery; + log_helper_pt* loghelper; + hash_map_pt entries; + + celix_thread_mutex_t watcherLock; + celix_thread_t watcherThread; + + volatile bool running; +}; + + +#define MAX_ROOTNODE_LENGTH 128 +#define MAX_LOCALNODE_LENGTH 4096 +#define MAX_VALUE_LENGTH 256 + +#define CFG_ETCD_ROOT_PATH "DISCOVERY_ETCD_ROOT_PATH" +#define DEFAULT_ETCD_ROOTPATH "discovery" + +#define CFG_ETCD_SERVER_IP "DISCOVERY_ETCD_SERVER_IP" +#define DEFAULT_ETCD_SERVER_IP "127.0.0.1" + +#define CFG_ETCD_SERVER_PORT "DISCOVERY_ETCD_SERVER_PORT" +#define DEFAULT_ETCD_SERVER_PORT 2379 + +// be careful - this should be higher than the curl timeout +#define CFG_ETCD_TTL "DISCOVERY_ETCD_TTL" +#define DEFAULT_ETCD_TTL 30 + + +// note that the rootNode shouldn't have a leading slash +static celix_status_t etcdWatcher_getRootPath(bundle_context_pt context, char* rootNode) { + celix_status_t status = CELIX_SUCCESS; + const char* rootPath = NULL; + + if (((bundleContext_getProperty(context, CFG_ETCD_ROOT_PATH, &rootPath)) != CELIX_SUCCESS) || (!rootPath)) { + strncpy(rootNode, DEFAULT_ETCD_ROOTPATH, MAX_ROOTNODE_LENGTH); + } + else { + strncpy(rootNode, rootPath, MAX_ROOTNODE_LENGTH); + } + + return status; +} + +static celix_status_t etcdWatcher_getLocalNodePath(bundle_context_pt context, char* localNodePath) { + celix_status_t status = CELIX_SUCCESS; + char rootPath[MAX_ROOTNODE_LENGTH]; + const char* uuid = NULL; + + if ((etcdWatcher_getRootPath(context, rootPath) != CELIX_SUCCESS)) { + status = CELIX_ILLEGAL_STATE; + } + else if (((bundleContext_getProperty(context, OSGI_FRAMEWORK_FRAMEWORK_UUID, &uuid)) != CELIX_SUCCESS) || (!uuid)) { + status = CELIX_ILLEGAL_STATE; + } + else if (rootPath[strlen(rootPath) - 1] == '/') { + snprintf(localNodePath, MAX_LOCALNODE_LENGTH, "%s%s", rootPath, uuid); + } + else { + snprintf(localNodePath, MAX_LOCALNODE_LENGTH, "%s/%s", rootPath, uuid); + } + + return status; +} + +static void add_node(const char *key, const char *value, void* arg) { + discovery_pt discovery = (discovery_pt) arg; + endpointDiscoveryPoller_addDiscoveryEndpoint(discovery->poller, (char *) value); +} + +/* + * retrieves all already existing discovery endpoints + * from etcd and adds them to the poller. + * + * returns the modifiedIndex of the last modified + * discovery endpoint (see etcd documentation). + */ +static celix_status_t etcdWatcher_addAlreadyExistingWatchpoints(discovery_pt discovery, long long* highestModified) { + celix_status_t status = CELIX_SUCCESS; + + char rootPath[MAX_ROOTNODE_LENGTH]; + status = etcdWatcher_getRootPath(discovery->context, rootPath); + + if (status == CELIX_SUCCESS) { + if(etcd_get_directory(rootPath, add_node, discovery, highestModified)) { + status = CELIX_ILLEGAL_ARGUMENT; + } + } + + return status; +} + + +static celix_status_t etcdWatcher_addOwnFramework(etcd_watcher_pt watcher) +{ + celix_status_t status = CELIX_BUNDLE_EXCEPTION; + char localNodePath[MAX_LOCALNODE_LENGTH]; + char *value; + char url[MAX_VALUE_LENGTH]; + int modIndex; + char* endpoints = NULL; + const char* ttlStr = NULL; + int ttl; + + bundle_context_pt context = watcher->discovery->context; + endpoint_discovery_server_pt server = watcher->discovery->server; + + // register own framework + if ((status = etcdWatcher_getLocalNodePath(context, localNodePath)) != CELIX_SUCCESS) { + return status; + } + + if (endpointDiscoveryServer_getUrl(server, url) != CELIX_SUCCESS) { + snprintf(url, MAX_VALUE_LENGTH, "http://%s:%s/%s", DEFAULT_SERVER_IP, DEFAULT_SERVER_PORT, DEFAULT_SERVER_PATH); + } + + endpoints = url; + + if ((bundleContext_getProperty(context, CFG_ETCD_TTL, &ttlStr) != CELIX_SUCCESS) || !ttlStr) { + ttl = DEFAULT_ETCD_TTL; + } + else + { + char* endptr = (char *) ttlStr; + errno = 0; + ttl = strtol(ttlStr, &endptr, 10); + if (*endptr || errno != 0) { + ttl = DEFAULT_ETCD_TTL; + } + } + + if (etcd_get(localNodePath, &value, &modIndex) != true) { + etcd_set(localNodePath, endpoints, ttl, false); + } + else if (etcd_set(localNodePath, endpoints, ttl, true) == false) { + logHelper_log(*watcher->loghelper, OSGI_LOGSERVICE_WARNING, "Cannot register local discovery"); + } + else { + status = CELIX_SUCCESS; + } + + FREE_MEM(value); + + return status; +} + + + + +static celix_status_t etcdWatcher_addEntry(etcd_watcher_pt watcher, char* key, char* value) { + celix_status_t status = CELIX_BUNDLE_EXCEPTION; + endpoint_discovery_poller_pt poller = watcher->discovery->poller; + + if (!hashMap_containsKey(watcher->entries, key)) { + status = endpointDiscoveryPoller_addDiscoveryEndpoint(poller, value); + + if (status == CELIX_SUCCESS) { + hashMap_put(watcher->entries, strdup(key), strdup(value)); + } + } + + return status; +} + +static celix_status_t etcdWatcher_removeEntry(etcd_watcher_pt watcher, char* key, char* value) { + celix_status_t status = CELIX_BUNDLE_EXCEPTION; + endpoint_discovery_poller_pt poller = watcher->discovery->poller; + + hash_map_entry_pt entry = hashMap_getEntry(watcher->entries, key); + + if (entry != NULL) { + void* origKey = hashMapEntry_getKey(entry); + void* value = hashMap_remove(watcher->entries, key); + + free(origKey); + + // check if there is another entry with the same value + hash_map_iterator_pt iter = hashMapIterator_create(watcher->entries); + unsigned int valueFound = 0; + + while (hashMapIterator_hasNext(iter) && valueFound <= 1) { + if (strcmp(value, hashMapIterator_nextValue(iter)) == 0) + valueFound++; + } + + hashMapIterator_destroy(iter); + + if (valueFound == 0) + status = endpointDiscoveryPoller_removeDiscoveryEndpoint(poller, value); + + free(value); + + } + + return status; + +} + + +/* + * performs (blocking) etcd_watch calls to check for + * changing discovery endpoint information within etcd. + */ +static void* etcdWatcher_run(void* data) { + etcd_watcher_pt watcher = (etcd_watcher_pt) data; + time_t timeBeforeWatch = time(NULL); + char rootPath[MAX_ROOTNODE_LENGTH]; + long long highestModified = 0; + + bundle_context_pt context = watcher->discovery->context; + + etcdWatcher_addAlreadyExistingWatchpoints(watcher->discovery, &highestModified); + etcdWatcher_getRootPath(context, rootPath); + + while (watcher->running) { + + char *rkey = NULL; + char *value = NULL; + char *preValue = NULL; + char *action = NULL; + long long modIndex; + + if (etcd_watch(rootPath, highestModified + 1, &action, &preValue, &value, &rkey, &modIndex) == 0 && action != NULL) { + if (strcmp(action, "set") == 0) { + etcdWatcher_addEntry(watcher, rkey, value); + } else if (strcmp(action, "delete") == 0) { + etcdWatcher_removeEntry(watcher, rkey, value); + } else if (strcmp(action, "expire") == 0) { + etcdWatcher_removeEntry(watcher, rkey, value); + } else if (strcmp(action, "update") == 0) { + etcdWatcher_addEntry(watcher, rkey, value); + } else { + logHelper_log(*watcher->loghelper, OSGI_LOGSERVICE_INFO, "Unexpected action: %s", action); + } + + highestModified = modIndex; + } else if (time(NULL) - timeBeforeWatch <= (DEFAULT_ETCD_TTL / 4)) { + sleep(DEFAULT_ETCD_TTL / 4); + } + + FREE_MEM(action); + FREE_MEM(value); + FREE_MEM(preValue); + FREE_MEM(rkey); + + // update own framework uuid + if (time(NULL) - timeBeforeWatch > (DEFAULT_ETCD_TTL / 4)) { + etcdWatcher_addOwnFramework(watcher); + timeBeforeWatch = time(NULL); + } + } + + return NULL; +} + +/* + * the ectdWatcher needs to have access to the endpoint_discovery_poller and therefore is only + * allowed to be created after the endpoint_discovery_poller + */ +celix_status_t etcdWatcher_create(discovery_pt discovery, bundle_context_pt context, + etcd_watcher_pt *watcher) +{ + celix_status_t status = CELIX_SUCCESS; + + const char* etcd_server = NULL; + const char* etcd_port_string = NULL; + int etcd_port = 0; + + if (discovery == NULL) { + return CELIX_BUNDLE_EXCEPTION; + } + + (*watcher) = calloc(1, sizeof(struct etcd_watcher)); + if (!*watcher) { + return CELIX_ENOMEM; + } + else + { + (*watcher)->discovery = discovery; + (*watcher)->loghelper = &discovery->loghelper; + (*watcher)->entries = hashMap_create(utils_stringHash, NULL, utils_stringEquals, NULL); + } + + if ((bundleContext_getProperty(context, CFG_ETCD_SERVER_IP, &etcd_server) != CELIX_SUCCESS) || !etcd_server) { + etcd_server = DEFAULT_ETCD_SERVER_IP; + } + + if ((bundleContext_getProperty(context, CFG_ETCD_SERVER_PORT, &etcd_port_string) != CELIX_SUCCESS) || !etcd_port_string) { + etcd_port = DEFAULT_ETCD_SERVER_PORT; + } + else + { + char* endptr = (char*)etcd_port_string; + errno = 0; + etcd_port = strtol(etcd_port_string, &endptr, 10); + if (*endptr || errno != 0) { + etcd_port = DEFAULT_ETCD_SERVER_PORT; + } + } + + if (etcd_init((char*) etcd_server, etcd_port, CURL_GLOBAL_DEFAULT) != 0) { + status = CELIX_BUNDLE_EXCEPTION; + } else { + status = CELIX_SUCCESS; + } + + if (status == CELIX_SUCCESS) { + etcdWatcher_addOwnFramework(*watcher); + status = celixThreadMutex_create(&(*watcher)->watcherLock, NULL); + } + + if (status == CELIX_SUCCESS) { + if (celixThreadMutex_lock(&(*watcher)->watcherLock) == CELIX_SUCCESS) { + status = celixThread_create(&(*watcher)->watcherThread, NULL, etcdWatcher_run, *watcher); + if (status == CELIX_SUCCESS) { + (*watcher)->running = true; + } + celixThreadMutex_unlock(&(*watcher)->watcherLock); + } + } + + return status; +} + + +celix_status_t etcdWatcher_destroy(etcd_watcher_pt watcher) { + celix_status_t status = CELIX_SUCCESS; + char localNodePath[MAX_LOCALNODE_LENGTH]; + + celixThreadMutex_lock(&watcher->watcherLock); + watcher->running = false; + celixThreadMutex_unlock(&watcher->watcherLock); + + celixThread_join(watcher->watcherThread, NULL); + + // register own framework + status = etcdWatcher_getLocalNodePath(watcher->discovery->context, localNodePath); + + if (status != CELIX_SUCCESS || etcd_del(localNodePath) == false) + { + logHelper_log(*watcher->loghelper, OSGI_LOGSERVICE_WARNING, "Cannot remove local discovery registration."); + } + + watcher->loghelper = NULL; + + hashMap_destroy(watcher->entries, true, true); + + free(watcher); + + return status; +} + http://git-wip-us.apache.org/repos/asf/celix/blob/a1c30887/remote_services/discovery_etcd/src/etcd_watcher.h ---------------------------------------------------------------------- diff --git a/remote_services/discovery_etcd/src/etcd_watcher.h b/remote_services/discovery_etcd/src/etcd_watcher.h new file mode 100644 index 0000000..b4dbf40 --- /dev/null +++ b/remote_services/discovery_etcd/src/etcd_watcher.h @@ -0,0 +1,40 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +/* + * etcd_watcher.h + * + * \date 17 Sep 2014 + * \author <a href="mailto:[email protected]">Apache Celix Project Team</a> + * \copyright Apache License, Version 2.0 + */ + +#ifndef ETCD_WATCHER_H_ +#define ETCD_WATCHER_H_ + +#include "celix_errno.h" +#include "discovery.h" +#include "endpoint_discovery_poller.h" + +typedef struct etcd_watcher *etcd_watcher_pt; + +celix_status_t etcdWatcher_create(discovery_pt discovery, bundle_context_pt context, etcd_watcher_pt *watcher); +celix_status_t etcdWatcher_destroy(etcd_watcher_pt watcher); + + +#endif /* ETCD_WATCHER_H_ */ http://git-wip-us.apache.org/repos/asf/celix/blob/a1c30887/remote_services/examples/CMakeLists.txt ---------------------------------------------------------------------- diff --git a/remote_services/examples/CMakeLists.txt b/remote_services/examples/CMakeLists.txt index 44b7733..c7c5444 100644 --- a/remote_services/examples/CMakeLists.txt +++ b/remote_services/examples/CMakeLists.txt @@ -18,97 +18,42 @@ celix_subproject(RSA_EXAMPLES "Option to enable building the RSA examples" ON DEPS LAUNCHER shell_tui log_writer RSA_TOPOLOGY_MANAGER) if (RSA_EXAMPLES) add_subdirectory(calculator_service) - - add_subdirectory(calculator_endpoint) - add_subdirectory(calculator_endpoint2) - - add_subdirectory(calculator_proxy) - add_subdirectory(calculator_proxy2) - add_subdirectory(calculator_shell) - if(BUILD_RSA_REMOTE_SERVICE_ADMIN_HTTP AND BUILD_RSA_DISCOVERY_CONFIGURED) - add_deploy(remote-services-cfg-server - NAME "server" - GROUP "remote-services/remote-services-cfg" - BUNDLES discovery_configured topology_manager remote_service_admin_http calculator shell shell_tui log_service log_writer - PROPERTIES - RSA_PORT=8001 - DISCOVERY_CFG_POLL_ENDPOINTS=http://localhost:8082/org.apache.celix.discovery.configured - DISCOVERY_CFG_SERVER_PORT=8081 - ) - deploy_bundles_dir(remote-services-cfg-server DIR_NAME "endpoints" BUNDLES - org.apache.celix.calc.api.Calculator_endpoint - org.apache.celix.calc.api.Calculator2_endpoint - ) - - add_deploy(remote-services-cfg-client - NAME "client" - GROUP "remote-services/remote-services-cfg" - BUNDLES topology_manager remote_service_admin_http shell shell_tui log_service log_writer calculator_shell discovery_configured - PROPERTIES - RSA_PORT=8002 - DISCOVERY_CFG_POLL_ENDPOINTS=http://localhost:8081/org.apache.celix.discovery.configured - DISCOVERY_CFG_SERVER_PORT=8082 - ) - deploy_bundles_dir(remote-services-cfg-client DIR_NAME "endpoints" - BUNDLES org.apache.celix.calc.api.Calculator_proxy org.apache.celix.calc.api.Calculator2_proxy - ) - endif() - - if (BUILD_RSA_REMOTE_SERVICE_ADMIN_SHM AND BUILD_RSA_DISCOVERY_SHM) - add_deploy(remote-services-shm - NAME "server" - GROUP "remote-services/remote-services-shm" - BUNDLES discovery_shm topology_manager remote_service_admin_shm calculator shell shell_tui log_service log_writer - ) - deploy_bundles_dir(remote-services-shm DIR_NAME "endpoints" - BUNDLES org.apache.celix.calc.api.Calculator_endpoint - ) - - add_deploy(remote-services-shm-client - NAME "client" - GROUP "remote-services/remote-services-shm" - BUNDLES topology_manager remote_service_admin_shm shell shell_tui log_service log_writer calculator_shell discovery_shm - ) - deploy_bundles_dir(remote-services-shm-client DIR_NAME "endpoints" - BUNDLES org.apache.celix.calc.api.Calculator_proxy - ) - endif () - if (BUILD_RSA_DISCOVERY_ETCD AND BUILD_RSA_REMOTE_SERVICE_ADMIN_HTTP) - add_deploy(remote-services-etcd - NAME "server" - GROUP "remote-services/remote-services-etcd" - BUNDLES discovery_etcd topology_manager remote_service_admin_http calculator shell shell_tui log_service log_writer - ) - deploy_bundles_dir(remote-services-etcd DIR_NAME "endpoints" - BUNDLES - org.apache.celix.calc.api.Calculator_endpoint - org.apache.celix.calc.api.Calculator2_endpoint - ) +# TODO refactor shm remote service admin to use dfi +# if (BUILD_RSA_REMOTE_SERVICE_ADMIN_SHM AND BUILD_RSA_DISCOVERY_SHM) +# add_deploy(remote-services-shm +# NAME "server" +# GROUP "remote-services/remote-services-shm" +# BUNDLES discovery_shm topology_manager remote_service_admin_shm calculator shell shell_tui log_service log_writer +# ) +# deploy_bundles_dir(remote-services-shm DIR_NAME "endpoints" +# BUNDLES org.apache.celix.calc.api.Calculator_endpoint +# ) +# +# add_deploy(remote-services-shm-client +# NAME "client" +# GROUP "remote-services/remote-services-shm" +# BUNDLES topology_manager remote_service_admin_shm shell shell_tui log_service log_writer calculator_shell discovery_shm +# ) +# deploy_bundles_dir(remote-services-shm-client DIR_NAME "endpoints" +# BUNDLES org.apache.celix.calc.api.Calculator_proxy +# ) +# endif () - add_deploy("remote-services-etcd-client" - NAME "client" - GROUP "remote-services/remote-services-etcd" - BUNDLES topology_manager remote_service_admin_http shell shell_tui log_service log_writer calculator_shell discovery_etcd - ) - deploy_bundles_dir(remote-services-etcd-client DIR_NAME "endpoints" - BUNDLES org.apache.celix.calc.api.Calculator_proxy - ) - endif () if (BUILD_RSA_DISCOVERY_ETCD AND BUILD_RSA_REMOTE_SERVICE_ADMIN_DFI) add_deploy(remote-services-dfi NAME "server" GROUP "remote-services/remote-services-dfi" - BUNDLES discovery_etcd topology_manager remote_service_admin_dfi calculator shell shell_tui log_service log_writer + BUNDLES discovery_etcd topology_manager remote_service_admin_dfi calculator Celix::shell Celix::shell_tui log_service log_writer ) add_deploy("remote-services-dfi-client" NAME "client" GROUP "remote-services/remote-services-dfi" - BUNDLES topology_manager remote_service_admin_dfi shell shell_tui log_service log_writer calculator_shell discovery_etcd + BUNDLES topology_manager remote_service_admin_dfi Celix::shell Celix::shell_tui log_service log_writer calculator_shell discovery_etcd ) endif () endif (RSA_EXAMPLES) http://git-wip-us.apache.org/repos/asf/celix/blob/a1c30887/remote_services/examples/calculator_endpoint/CMakeLists.txt ---------------------------------------------------------------------- diff --git a/remote_services/examples/calculator_endpoint/CMakeLists.txt b/remote_services/examples/calculator_endpoint/CMakeLists.txt deleted file mode 100644 index 6e9c928..0000000 --- a/remote_services/examples/calculator_endpoint/CMakeLists.txt +++ /dev/null @@ -1,35 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. - -find_package(Jansson REQUIRED) - -include_directories("${JANSSON_INCLUDE_DIRS}") -include_directories("../../../utils/public/include") -include_directories("../../remote_service_admin/public/include") -include_directories("../calculator_service/public/include") -include_directories("private/include") - -add_bundle(org.apache.celix.calc.api.Calculator_endpoint SOURCES - private/src/calculator_endpoint_activator - private/src/calculator_endpoint_impl.c - - private/include/calculator_endpoint_impl.h - VERSION 0.0.1 - SYMBOLIC_NAME "apache_celix_remoting_calculator_endpoint" -) - -target_link_libraries(org.apache.celix.calc.api.Calculator_endpoint celix_framework ${JANSSON_LIBRARIES}) http://git-wip-us.apache.org/repos/asf/celix/blob/a1c30887/remote_services/examples/calculator_endpoint/private/include/calculator_endpoint_impl.h ---------------------------------------------------------------------- diff --git a/remote_services/examples/calculator_endpoint/private/include/calculator_endpoint_impl.h b/remote_services/examples/calculator_endpoint/private/include/calculator_endpoint_impl.h deleted file mode 100644 index dbeda2d..0000000 --- a/remote_services/examples/calculator_endpoint/private/include/calculator_endpoint_impl.h +++ /dev/null @@ -1,46 +0,0 @@ -/** - *Licensed to the Apache Software Foundation (ASF) under one - *or more contributor license agreements. See the NOTICE file - *distributed with this work for additional information - *regarding copyright ownership. The ASF licenses this file - *to you under the Apache License, Version 2.0 (the - *"License"); you may not use this file except in compliance - *with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - *Unless required by applicable law or agreed to in writing, - *software distributed under the License is distributed on an - *"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - *specific language governing permissions and limitations - *under the License. - */ -/* - * calculator_endpoint_impl.h - * - * \date Oct 7, 2011 - * \author <a href="mailto:[email protected]">Apache Celix Project Team</a> - * \copyright Apache License, Version 2.0 - */ - -#ifndef CALCULATOR_ENDPOINT_IMPL_H_ -#define CALCULATOR_ENDPOINT_IMPL_H_ - -#include "celix_errno.h" -#include "remote_endpoint_impl.h" - -#include "calculator_service.h" - -celix_status_t calculatorEndpoint_create(remote_endpoint_pt *endpoint); -celix_status_t calculatorEndpoint_destroy(remote_endpoint_pt *endpoint); - -celix_status_t calculatorEndpoint_setService(remote_endpoint_pt endpoint, void *service); - -celix_status_t calculatorEndpoint_handleRequest(remote_endpoint_pt endpoint, char *data, char **reply); - -celix_status_t calculatorEndpoint_add(remote_endpoint_pt endpoint, char *data, char **reply); -celix_status_t calculatorEndpoint_sub(remote_endpoint_pt endpoint, char *data, char **reply); -celix_status_t calculatorEndpoint_sqrt(remote_endpoint_pt endpoint, char *data, char **reply); - -#endif /* CALCULATOR_ENDPOINT_IMPL_H_ */ http://git-wip-us.apache.org/repos/asf/celix/blob/a1c30887/remote_services/examples/calculator_endpoint/private/src/calculator_endpoint_activator.c ---------------------------------------------------------------------- diff --git a/remote_services/examples/calculator_endpoint/private/src/calculator_endpoint_activator.c b/remote_services/examples/calculator_endpoint/private/src/calculator_endpoint_activator.c deleted file mode 100644 index 319ecb0..0000000 --- a/remote_services/examples/calculator_endpoint/private/src/calculator_endpoint_activator.c +++ /dev/null @@ -1,96 +0,0 @@ -/** - *Licensed to the Apache Software Foundation (ASF) under one - *or more contributor license agreements. See the NOTICE file - *distributed with this work for additional information - *regarding copyright ownership. The ASF licenses this file - *to you under the Apache License, Version 2.0 (the - *"License"); you may not use this file except in compliance - *with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - *Unless required by applicable law or agreed to in writing, - *software distributed under the License is distributed on an - *"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - *specific language governing permissions and limitations - *under the License. - */ -/* - * calculator_endpoint_activator.c - * - * \date Oct 10, 2011 - * \author <a href="mailto:[email protected]">Apache Celix Project Team</a> - * \copyright Apache License, Version 2.0 - */ -#include <stdlib.h> - -#include "bundle_activator.h" - -#include "calculator_endpoint_impl.h" -#include "service_registration.h" - -struct activator { - remote_endpoint_service_pt endpointService; - service_registration_pt endpointServiceRegistration; -}; - -celix_status_t bundleActivator_create(bundle_context_pt context, void **userData) { - celix_status_t status = CELIX_SUCCESS; - - struct activator *activator; - - activator = calloc(1, sizeof(*activator)); - if (!activator) { - status = CELIX_ENOMEM; - } else { - activator->endpointService = NULL; - activator->endpointServiceRegistration = NULL; - - *userData = activator; - } - - return status; -} - -celix_status_t bundleActivator_start(void * userData, bundle_context_pt context) { - celix_status_t status = CELIX_SUCCESS; - struct activator *activator = userData; - remote_endpoint_pt endpoint = NULL; - remote_endpoint_service_pt endpointService = NULL; - - calculatorEndpoint_create(&endpoint); - endpointService = calloc(1, sizeof(*endpointService)); - endpointService->endpoint = endpoint; - endpointService->handleRequest = calculatorEndpoint_handleRequest; - endpointService->setService = calculatorEndpoint_setService; - - properties_pt props = properties_create(); - properties_set(props, (char *) "remote.interface", (char *) CALCULATOR_SERVICE); - - bundleContext_registerService(context, OSGI_RSA_REMOTE_ENDPOINT, endpointService, props, &activator->endpointServiceRegistration); - - activator->endpointService = endpointService; - - return status; -} - -celix_status_t bundleActivator_stop(void * userData, bundle_context_pt context) { - celix_status_t status = CELIX_SUCCESS; - struct activator *activator = userData; - - serviceRegistration_unregister(activator->endpointServiceRegistration); - - calculatorEndpoint_destroy(&activator->endpointService->endpoint); - free(activator->endpointService); - - return status; -} - -celix_status_t bundleActivator_destroy(void * userData, bundle_context_pt context) { - celix_status_t status = CELIX_SUCCESS; - struct activator *activator = userData; - - free(activator); - return status; -} http://git-wip-us.apache.org/repos/asf/celix/blob/a1c30887/remote_services/examples/calculator_endpoint/private/src/calculator_endpoint_impl.c ---------------------------------------------------------------------- diff --git a/remote_services/examples/calculator_endpoint/private/src/calculator_endpoint_impl.c b/remote_services/examples/calculator_endpoint/private/src/calculator_endpoint_impl.c deleted file mode 100644 index b9a973f..0000000 --- a/remote_services/examples/calculator_endpoint/private/src/calculator_endpoint_impl.c +++ /dev/null @@ -1,184 +0,0 @@ -/** - *Licensed to the Apache Software Foundation (ASF) under one - *or more contributor license agreements. See the NOTICE file - *distributed with this work for additional information - *regarding copyright ownership. The ASF licenses this file - *to you under the Apache License, Version 2.0 (the - *"License"); you may not use this file except in compliance - *with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - *Unless required by applicable law or agreed to in writing, - *software distributed under the License is distributed on an - *"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - *specific language governing permissions and limitations - *under the License. - */ -/* - * calculator_endpoint_impl.c - * - * \date Oct 7, 2011 - * \author <a href="mailto:[email protected]">Apache Celix Project Team</a> - * \copyright Apache License, Version 2.0 - */ -#include <jansson.h> -#include <string.h> - -#include "celix_errno.h" - -#include "calculator_endpoint_impl.h" - -celix_status_t calculatorEndpoint_create(remote_endpoint_pt *endpoint) { - celix_status_t status = CELIX_SUCCESS; - *endpoint = calloc(1, sizeof(**endpoint)); - if (!*endpoint) { - status = CELIX_ENOMEM; - } else { - (*endpoint)->service = NULL; - } - - return status; -} - -celix_status_t calculatorEndpoint_destroy(remote_endpoint_pt *endpoint) { - celix_status_t status = CELIX_SUCCESS; - free(*endpoint); - *endpoint = NULL; - - return status; -} - -celix_status_t calculatorEndpoint_setService(remote_endpoint_pt endpoint, void *service) { - celix_status_t status = CELIX_SUCCESS; - endpoint->service = service; - return status; -} - -/** - * Request: http://host:port/services/{service} - */ -celix_status_t calculatorEndpoint_handleRequest(remote_endpoint_pt endpoint, char *data, char **reply) { - celix_status_t status = CELIX_SUCCESS; - json_error_t jsonError; - json_t *root = json_loads(data, 0, &jsonError); - const char *sig; - json_unpack(root, "{s:s}", "m", &sig); - - printf("CALCULATOR_ENDPOINT: Handle request \"%s\" with data \"%s\"\n", sig, data); - if (strcmp(sig, "add(DD)D") == 0) { - calculatorEndpoint_add(endpoint, data, reply); - } else if (strcmp(sig, "sub(DD)D") == 0) { - calculatorEndpoint_sub(endpoint, data, reply); - } else if (strcmp(sig, "sqrt(D)D") == 0) { - calculatorEndpoint_sqrt(endpoint, data, reply); - } else { - status = CELIX_ILLEGAL_ARGUMENT; - } - - json_decref(root); - - return status; -} - -celix_status_t calculatorEndpoint_add(remote_endpoint_pt endpoint, char *data, char **reply) { - celix_status_t status = CELIX_SUCCESS; - json_error_t jsonError; - json_t *root; - - root = json_loads(data, 0, &jsonError); - if (!root) { - status = CELIX_ILLEGAL_ARGUMENT; - } else { - double a; - double b; - json_unpack(root, "{s:[ff]}", "a", &a, &b); - - if (endpoint->service != NULL) { - double result; - json_t *resultRoot; - calculator_service_pt service = endpoint->service; - service->add(service->calculator, a, b, &result); - resultRoot = json_pack("{s:f}", "r", result); - - char *c = json_dumps(resultRoot, 0); - *reply = c; - - json_decref(resultRoot); - } else { - printf("CALCULATOR_ENDPOINT: No service available"); - status = CELIX_BUNDLE_EXCEPTION; - } - json_decref(root); - } - - return status; -} - -celix_status_t calculatorEndpoint_sub(remote_endpoint_pt endpoint, char *data, char **reply) { - celix_status_t status = CELIX_SUCCESS; - json_error_t jsonError; - json_t *root; - - root = json_loads(data, 0, &jsonError); - if (!root) { - status = CELIX_ILLEGAL_ARGUMENT; - } else { - double a; - double b; - json_unpack(root, "{s:[ff]}", "a", &a, &b); - - if (endpoint->service != NULL) { - double result; - json_t *resultRoot; - calculator_service_pt service = endpoint->service; - service->sub(service->calculator, a, b, &result); - resultRoot = json_pack("{s:f}", "r", result); - - char *c = json_dumps(resultRoot, JSON_ENCODE_ANY); - *reply = c; - - json_decref(resultRoot); - } else { - printf("CALCULATOR_ENDPOINT: No service available"); - status = CELIX_BUNDLE_EXCEPTION; - } - json_decref(root); - } - - return status; -} - -celix_status_t calculatorEndpoint_sqrt(remote_endpoint_pt endpoint, char *data, char **reply) { - celix_status_t status = CELIX_SUCCESS; - json_error_t jsonError; - json_t *root; - - root = json_loads(data, 0, &jsonError); - if (!root) { - status = CELIX_ILLEGAL_ARGUMENT; - } else { - double a; - json_unpack(root, "{s:[f]}", "a", &a); - - if (endpoint->service != NULL) { - double result; - json_t *resultRoot; - calculator_service_pt service = endpoint->service; - service->sqrt(service->calculator, a, &result); - resultRoot = json_pack("{s:f}", "r", result); - - char *c = json_dumps(resultRoot, JSON_ENCODE_ANY); - *reply = c; - - json_decref(resultRoot); - } else { - printf("CALCULATOR_ENDPOINT: No service available"); - status = CELIX_BUNDLE_EXCEPTION; - } - json_decref(root); - } - - return status; -} http://git-wip-us.apache.org/repos/asf/celix/blob/a1c30887/remote_services/examples/calculator_endpoint2/CMakeLists.txt ---------------------------------------------------------------------- diff --git a/remote_services/examples/calculator_endpoint2/CMakeLists.txt b/remote_services/examples/calculator_endpoint2/CMakeLists.txt deleted file mode 100644 index b75e6df..0000000 --- a/remote_services/examples/calculator_endpoint2/CMakeLists.txt +++ /dev/null @@ -1,35 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. - -find_package(Jansson REQUIRED) - -include_directories("${JANSSON_INCLUDE_DIRS}") -include_directories("../../../utils/public/include") -include_directories("../../remote_service_admin/public/include") -include_directories("../calculator_service/public/include") -include_directories("private/include") - -add_bundle(org.apache.celix.calc.api.Calculator2_endpoint SOURCES - private/src/calculator_endpoint_activator - private/src/calculator_endpoint_impl.c - - private/include/calculator_endpoint_impl.h - SYMBOLIC_NAME "apache_celix_remoting_calculator2_endpoint" - VERSION "0.0.1" -) - -target_link_libraries(org.apache.celix.calc.api.Calculator2_endpoint celix_framework ${JANSSON_LIBRARIES}) http://git-wip-us.apache.org/repos/asf/celix/blob/a1c30887/remote_services/examples/calculator_endpoint2/private/include/calculator_endpoint_impl.h ---------------------------------------------------------------------- diff --git a/remote_services/examples/calculator_endpoint2/private/include/calculator_endpoint_impl.h b/remote_services/examples/calculator_endpoint2/private/include/calculator_endpoint_impl.h deleted file mode 100644 index dbeda2d..0000000 --- a/remote_services/examples/calculator_endpoint2/private/include/calculator_endpoint_impl.h +++ /dev/null @@ -1,46 +0,0 @@ -/** - *Licensed to the Apache Software Foundation (ASF) under one - *or more contributor license agreements. See the NOTICE file - *distributed with this work for additional information - *regarding copyright ownership. The ASF licenses this file - *to you under the Apache License, Version 2.0 (the - *"License"); you may not use this file except in compliance - *with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - *Unless required by applicable law or agreed to in writing, - *software distributed under the License is distributed on an - *"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - *specific language governing permissions and limitations - *under the License. - */ -/* - * calculator_endpoint_impl.h - * - * \date Oct 7, 2011 - * \author <a href="mailto:[email protected]">Apache Celix Project Team</a> - * \copyright Apache License, Version 2.0 - */ - -#ifndef CALCULATOR_ENDPOINT_IMPL_H_ -#define CALCULATOR_ENDPOINT_IMPL_H_ - -#include "celix_errno.h" -#include "remote_endpoint_impl.h" - -#include "calculator_service.h" - -celix_status_t calculatorEndpoint_create(remote_endpoint_pt *endpoint); -celix_status_t calculatorEndpoint_destroy(remote_endpoint_pt *endpoint); - -celix_status_t calculatorEndpoint_setService(remote_endpoint_pt endpoint, void *service); - -celix_status_t calculatorEndpoint_handleRequest(remote_endpoint_pt endpoint, char *data, char **reply); - -celix_status_t calculatorEndpoint_add(remote_endpoint_pt endpoint, char *data, char **reply); -celix_status_t calculatorEndpoint_sub(remote_endpoint_pt endpoint, char *data, char **reply); -celix_status_t calculatorEndpoint_sqrt(remote_endpoint_pt endpoint, char *data, char **reply); - -#endif /* CALCULATOR_ENDPOINT_IMPL_H_ */ http://git-wip-us.apache.org/repos/asf/celix/blob/a1c30887/remote_services/examples/calculator_endpoint2/private/src/calculator_endpoint_activator.c ---------------------------------------------------------------------- diff --git a/remote_services/examples/calculator_endpoint2/private/src/calculator_endpoint_activator.c b/remote_services/examples/calculator_endpoint2/private/src/calculator_endpoint_activator.c deleted file mode 100644 index 9f89d91..0000000 --- a/remote_services/examples/calculator_endpoint2/private/src/calculator_endpoint_activator.c +++ /dev/null @@ -1,96 +0,0 @@ -/** - *Licensed to the Apache Software Foundation (ASF) under one - *or more contributor license agreements. See the NOTICE file - *distributed with this work for additional information - *regarding copyright ownership. The ASF licenses this file - *to you under the Apache License, Version 2.0 (the - *"License"); you may not use this file except in compliance - *with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - *Unless required by applicable law or agreed to in writing, - *software distributed under the License is distributed on an - *"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - *specific language governing permissions and limitations - *under the License. - */ -/* - * calculator_endpoint_activator.c - * - * \date Oct 10, 2011 - * \author <a href="mailto:[email protected]">Apache Celix Project Team</a> - * \copyright Apache License, Version 2.0 - */ -#include <stdlib.h> - -#include "bundle_activator.h" - -#include "calculator_endpoint_impl.h" -#include "service_registration.h" - -struct activator { - remote_endpoint_service_pt endpointService; - service_registration_pt endpointServiceRegistration; -}; - -celix_status_t bundleActivator_create(bundle_context_pt context, void **userData) { - celix_status_t status = CELIX_SUCCESS; - - struct activator *activator; - - activator = calloc(1, sizeof(*activator)); - if (!activator) { - status = CELIX_ENOMEM; - } else { - activator->endpointService = NULL; - activator->endpointServiceRegistration = NULL; - - *userData = activator; - } - - return status; -} - -celix_status_t bundleActivator_start(void * userData, bundle_context_pt context) { - celix_status_t status = CELIX_SUCCESS; - struct activator *activator = userData; - remote_endpoint_pt endpoint = NULL; - remote_endpoint_service_pt endpointService = NULL; - - calculatorEndpoint_create(&endpoint); - endpointService = calloc(1, sizeof(*endpointService)); - endpointService->endpoint = endpoint; - endpointService->handleRequest = calculatorEndpoint_handleRequest; - endpointService->setService = calculatorEndpoint_setService; - - properties_pt props = properties_create(); - properties_set(props, (char *) "remote.interface", (char *) CALCULATOR2_SERVICE); - - bundleContext_registerService(context, OSGI_RSA_REMOTE_ENDPOINT, endpointService, props, &activator->endpointServiceRegistration); - - activator->endpointService = endpointService; - - return status; -} - -celix_status_t bundleActivator_stop(void * userData, bundle_context_pt context) { - celix_status_t status = CELIX_SUCCESS; - struct activator *activator = userData; - - serviceRegistration_unregister(activator->endpointServiceRegistration); - - calculatorEndpoint_destroy(&activator->endpointService->endpoint); - free(activator->endpointService); - - return status; -} - -celix_status_t bundleActivator_destroy(void * userData, bundle_context_pt context) { - celix_status_t status = CELIX_SUCCESS; - struct activator *activator = userData; - - free(activator); - return status; -}
