Initial structure for Network Manager project
authorLomtev Dmytro <d.lomtev@samsung.com>
Wed, 12 Apr 2017 12:03:40 +0000 (15:03 +0300)
committerLomtev Dmytro <d.lomtev@samsung.com>
Wed, 12 Apr 2017 12:03:40 +0000 (15:03 +0300)
14 files changed:
network-manager/CMakeLists.txt [new file with mode: 0644]
network-manager/NetworkManager.manifest [new file with mode: 0644]
network-manager/nmlib/CMakeLists.txt [new file with mode: 0644]
network-manager/nmlib/REST/inc/log.h [new file with mode: 0644]
network-manager/nmlib/REST/inc/rest_helper.h [new file with mode: 0644]
network-manager/nmlib/REST/src/rest_helper.cpp [new file with mode: 0644]
network-manager/packaging/ioswsec.spec [new file with mode: 0644]
network-manager/scripts/build-all-gbs.sh [new file with mode: 0755]
network-manager/scripts/deploy.sh [new file with mode: 0755]
network-manager/scripts/gbs.conf [new file with mode: 0644]
network-manager/test/CMakeLists.txt [new file with mode: 0644]
network-manager/test/test_REST.cpp [new file with mode: 0644]
network-manager/test/test_all.cpp [new file with mode: 0644]
network-manager/test/tests.manifest [new file with mode: 0644]

diff --git a/network-manager/CMakeLists.txt b/network-manager/CMakeLists.txt
new file mode 100644 (file)
index 0000000..e8092cf
--- /dev/null
@@ -0,0 +1,16 @@
+cmake_minimum_required (VERSION 2.8)
+
+SET (PROJECT_ROOT ${CMAKE_CURRENT_LIST_DIR})
+SET (NETWORK_MANAGER_LIB ${PROJECT_ROOT}/nmlib)
+SET (NETWORK_MANAGER_LIB_PROJECT_NAME nmlib)
+
+if (NOT DEFINED LIBDIR)
+    SET (LIBDIR "/usr/lib64")
+endif (NOT DEFINED LIBDIR)
+
+if (NOT DEFINED TESTS_DIR)
+    SET (TESTS_DIR "/opt/usr/apps/network-manager")
+endif (NOT DEFINED TESTS_DIR)
+
+add_subdirectory(nmlib)
+add_subdirectory(test)
\ No newline at end of file
diff --git a/network-manager/NetworkManager.manifest b/network-manager/NetworkManager.manifest
new file mode 100644 (file)
index 0000000..75b0fa5
--- /dev/null
@@ -0,0 +1,5 @@
+<manifest>
+    <request>
+        <domain name="_"/>
+    </request>
+</manifest>
diff --git a/network-manager/nmlib/CMakeLists.txt b/network-manager/nmlib/CMakeLists.txt
new file mode 100644 (file)
index 0000000..c6bd1a7
--- /dev/null
@@ -0,0 +1,31 @@
+cmake_minimum_required (VERSION 2.8)
+
+project (${NETWORK_MANAGER_LIB_PROJECT_NAME})
+
+add_definitions(-std=c++11)
+
+INCLUDE(FindPkgConfig)
+
+pkg_check_modules(NMLIB_REQ_PKGS REQUIRED libcurl)
+
+include_directories(REST/inc)
+SET(LIB_SOURCES REST/src/rest_helper.cpp)
+
+FOREACH(flag ${pkgs_CFLAGS})
+       SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} ${flag}")
+ENDFOREACH(flag)
+
+SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_CFLAGS}")
+SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${EXTRA_CFLAGS}")
+
+FOREACH(flag ${pkgs_LDFLAGS})
+       SET(EXTRA_LDFLAGS ${EXTRA_LDFLAGS} ${flag})
+ENDFOREACH(flag)
+
+add_library(${PROJECT_NAME} SHARED ${LIB_SOURCES})
+
+target_link_libraries(${PROJECT_NAME} ${NMLIB_REQ_PKGS_LIBRARIES})
+#target_link_libraries(${PROJECT_NAME} curl)
+
+
+install(TARGETS ${PROJECT_NAME} DESTINATION ${LIBDIR})
diff --git a/network-manager/nmlib/REST/inc/log.h b/network-manager/nmlib/REST/inc/log.h
new file mode 100644 (file)
index 0000000..1fb6a93
--- /dev/null
@@ -0,0 +1,9 @@
+#ifndef __LOG_H__
+#define __LOG_H__
+
+#include <cstdio>
+
+#define LOG_INFO(fmt, ...)  printf("[INFO] " fmt "\n", ##__VA_ARGS__)
+#define LOG_ERR(fmt, ...)  printf("[ERR] " fmt "\n", ##__VA_ARGS__)
+
+#endif
\ No newline at end of file
diff --git a/network-manager/nmlib/REST/inc/rest_helper.h b/network-manager/nmlib/REST/inc/rest_helper.h
new file mode 100644 (file)
index 0000000..0a900c5
--- /dev/null
@@ -0,0 +1,124 @@
+/**
+    @file rest_helper.h
+    @brief Represents something with rest.
+    @author Aleksey Volkov (a.volkov@samsung.com)
+    @date Created Jul 20, 2016
+    @par In Samsung Ukraine R&D Center (SRK) under a contract between
+    @par LLC "Samsung Electronics Ukraine Company" (Kyiv, Ukraine)
+    @par and "Samsung Electronics Co", Ltd (Seoul, Republic of Korea)
+    @par Copyright: (c) Samsung Electronics Co, Ltd 2016. All rights reserved.
+**/
+
+#ifndef REST_HELPER_H_
+#define REST_HELPER_H_
+
+#include <curl/curl.h>
+
+#include <map>
+#include <string>
+
+
+namespace network
+{
+/**
+ * @class RestHelper
+ * @brief Provide simple API over libcurl functions
+ */
+class RestHelper final
+{
+public:
+    /**
+     * @typedef Params
+     * @brief HTTP request parameters map type
+     */
+    typedef std::map<std::string, std::string> Params;
+
+    /**
+     * @enum class Result
+     * @brief HTTP result enum type
+     */
+    enum Result : int
+    {
+        REST_SUCCESS    = 200,
+        BAD_REQUEST     = 400,
+        REST_RESTRICTED = 401,
+        REST_FORBIDDEN  = 403,
+        REST_NOTFOUND   = 404
+    };
+
+public:
+    /**
+     * @brief Default constructor
+     * @param[in] IP or hostname
+     */
+    RestHelper(const std::string&);
+
+    /**
+     * @brief Destructor
+     */
+    ~RestHelper();
+
+    /**
+     * @brief PUT type request method
+     * @param[in] Param map with request parameters
+     * @param[in] request uri string
+     * @param[in] request body
+     * @return HTTP result
+     */
+    Result          PutRequest(const Params& param, const std::string& uri, const std::string& body);
+
+    /**
+     * @brief POST type request method
+     * @param[in] Param map with request parameters
+     * @param[in] request uri string
+     * @param[in] request body
+     * @return HTTP result
+     */
+    Result          PostRequest(const Params& param, const std::string& uri, const std::string& body);
+
+    /**
+     * @brief GET type request method
+     * @param[in] Param map with request parameters
+     * @param[in] request uri string
+     * @param[out] response body
+     * @return HTTP result
+     */
+    Result          GetRequest(const Params& param, const std::string& uri, std::string& body);
+
+    /**
+     * @brief Used to get latest request response body.
+     * @return Last response body string
+     */
+    std::string     GetLastBody();
+
+private:
+
+    /**
+     * @brief Internal method to perform HTTP requests
+     * @param[in] Param map with request parameters
+     * @param[in] uri string
+     */
+    Result  ProcessRequest(const Params&, const std::string&);
+
+    /**
+     * @brief cURL write callback function
+     */
+    static size_t WriteCallback(void*, size_t, size_t, void*);
+
+    /**
+     * @brief cURL read callback function
+     */
+    static size_t ReadCallback(void*, size_t, size_t, void*);
+
+private:
+
+    CURL*       m_curlHandle;   /**< cURL handle */
+    std::string m_urlBase;      /**< Hostname or IP */
+    std::string m_readBody;     /**< Buffer string for read callback */
+    std::string m_writeBody;    /**< Buffer string for write call back */
+
+};
+
+} // namespace network
+
+#endif //REST_HELPER_H_ 
diff --git a/network-manager/nmlib/REST/src/rest_helper.cpp b/network-manager/nmlib/REST/src/rest_helper.cpp
new file mode 100644 (file)
index 0000000..020496e
--- /dev/null
@@ -0,0 +1,164 @@
+/**
+    @file rest_helper.cpp
+    @brief Represents something with rest.
+    @author Aleksey Volkov (a.volkov@samsung.com)
+    @date Created Jul 20, 2016
+    @par In Samsung Ukraine R&D Center (SRK) under a contract between
+    @par LLC "Samsung Electronics Ukraine Company" (Kyiv, Ukraine)
+    @par and "Samsung Electronics Co", Ltd (Seoul, Republic of Korea)
+    @par Copyright: (c) Samsung Electronics Co, Ltd 2016. All rights reserved.
+**/
+
+
+#include "rest_helper.h"
+#include "log.h"
+
+#include <cstring>
+
+static class CurlInitializer
+{
+public:
+    CurlInitializer()
+    {
+        curl_global_init(CURL_GLOBAL_ALL);
+    }
+
+    ~CurlInitializer()
+    {
+        curl_global_cleanup();
+    }
+} curlGlobalInitialize;
+
+
+namespace network
+{
+
+RestHelper::RestHelper(const std::string& url)
+    : m_curlHandle(nullptr)
+    , m_urlBase(url)
+    , m_readBody()
+    , m_writeBody()
+{
+    m_curlHandle = curl_easy_init();
+
+    if (!m_curlHandle)
+    {
+        throw std::runtime_error("cURL init error!");
+    }
+
+    curl_easy_setopt(m_curlHandle, CURLOPT_TIMEOUT, 5);
+}
+
+RestHelper::~RestHelper()
+{
+    if (m_curlHandle)
+    {
+        curl_easy_cleanup(m_curlHandle);
+    }
+}
+
+RestHelper::Result
+RestHelper::PutRequest(const Params& params, const std::string& uri, const std::string& putBody)
+{
+    m_readBody = putBody;
+    curl_easy_setopt(m_curlHandle, CURLOPT_PUT, 1L);
+    curl_easy_setopt(m_curlHandle, CURLOPT_UPLOAD, 1L);
+    curl_easy_setopt(m_curlHandle, CURLOPT_READFUNCTION, ReadCallback);
+    curl_easy_setopt(m_curlHandle, CURLOPT_READDATA, this);
+    curl_easy_setopt(m_curlHandle, CURLOPT_INFILESIZE, static_cast<long>(putBody.length()));
+
+    return ProcessRequest(params, uri);
+}
+
+RestHelper::Result
+RestHelper::PostRequest(const Params& params, const std::string& uri, const std::string& postBody)
+{
+    curl_easy_setopt(m_curlHandle, CURLOPT_POST, 1L);
+    curl_easy_setopt(m_curlHandle, CURLOPT_POSTFIELDS, postBody.c_str());
+    curl_easy_setopt(m_curlHandle, CURLOPT_POSTFIELDSIZE, postBody.size());
+
+    return ProcessRequest(params, uri);
+}
+
+RestHelper::Result
+RestHelper::GetRequest(const Params& params, const std::string& uri, std::string& body)
+{
+    Result res = ProcessRequest(params, uri);
+    body = GetLastBody();
+
+    return res;
+}
+
+std::string
+RestHelper::GetLastBody()
+{
+    return m_writeBody;
+}
+
+RestHelper::Result
+RestHelper::ProcessRequest(const Params& params, const std::string& uri)
+{
+    m_writeBody.erase();
+    std::string strParam;
+
+    for (auto i : params)
+    {
+        if (strParam.empty())
+        {
+            strParam += "?";
+        }
+        else
+        {
+            strParam += "&";
+        }
+
+        strParam += (i.first + "=" + i.second);
+    }
+
+    std::string url = std::string(m_urlBase + uri + strParam);
+
+    curl_easy_setopt(m_curlHandle, CURLOPT_URL, url.c_str());
+
+    curl_easy_setopt(m_curlHandle, CURLOPT_WRITEFUNCTION, WriteCallback);
+    curl_easy_setopt(m_curlHandle, CURLOPT_WRITEDATA, this);
+
+    LOG_INFO("Performing request to: [%s]", url.c_str());
+
+    CURLcode res = curl_easy_perform(m_curlHandle);
+
+    if (res != CURLE_OK)
+    {
+        throw std::runtime_error("cURL perform request error!");
+    }
+
+    long code;
+    curl_easy_getinfo(m_curlHandle, CURLINFO_RESPONSE_CODE, &code);
+
+    curl_easy_reset(m_curlHandle);
+
+    return static_cast<Result>(code);
+}
+
+size_t RestHelper::WriteCallback(void* data, size_t size, size_t nmemb, void* ptr)
+{
+    RestHelper& r = *(reinterpret_cast<RestHelper*>(ptr));
+    r.m_writeBody.append(reinterpret_cast<char*>(data), size * nmemb);
+
+    return (size * nmemb);
+}
+
+size_t RestHelper::ReadCallback(void* data, size_t size, size_t nmemb, void* ptr)
+{
+    RestHelper& r = *(reinterpret_cast<RestHelper*>(ptr));
+    size_t curlLen = size * nmemb;
+    size_t readLen = r.m_readBody.length() < curlLen ? r.m_readBody.length() : curlLen;
+
+    std::memcpy(data, r.m_readBody.data(), readLen);
+
+    r.m_readBody.erase(0, readLen);
+
+    return readLen;
+}
+
+}// namespace network
+
diff --git a/network-manager/packaging/ioswsec.spec b/network-manager/packaging/ioswsec.spec
new file mode 100644 (file)
index 0000000..a0dac59
--- /dev/null
@@ -0,0 +1,60 @@
+Name:       nwmanager
+Version:    1.0.0
+Release:    2
+Summary:    TODO
+
+License:    Apache
+Source0:    %{name}-%{version}.tar.gz
+
+BuildRequires: cmake
+BuildRequires: pkgconfig(libcurl)
+BuildRequires: gtest
+BuildRequires: gtest-devel
+#BuildRequires: pkgconfig(gtest_gmock)
+
+%define _tests_dir /opt/usr/apps/network-manager
+
+%description
+Network manager project
+
+%prep
+%setup -q
+
+%build
+cmake . \
+    -DLIB_INSTALL_DIR=%{_libdir}
+make %{?jobs:-j%jobs}
+
+%install
+%make_install
+
+%clean
+rm -rf %{buildroot}
+
+##############################################
+# Network Manager
+##############################################
+
+%package nwmanager
+Summary: Network Manager library
+%description nwmanager
+Network Manager shared library
+
+
+%files
+%defattr(-,root,root,-)
+%{_libdir}/libnmlib.so
+
+
+##############################################
+# Unit tests
+##############################################
+
+%package test
+Summary: Unit tests
+Requires: nmlib
+%description test
+Google tests
+
+%files test
+%attr(0755,root,root) %{_tests_dir}/test
\ No newline at end of file
diff --git a/network-manager/scripts/build-all-gbs.sh b/network-manager/scripts/build-all-gbs.sh
new file mode 100755 (executable)
index 0000000..15473f1
--- /dev/null
@@ -0,0 +1,28 @@
+#!/bin/bash
+
+SCRIPT_PATH=$(readlink -m ${0})
+echo SCRIPT_PATH ${SCRIPT_PATH}
+SCRIPT_DIR=${SCRIPT_PATH%/*}
+echo SCRIPT_DIR ${SCRIPT_DIR}
+ROOT_DIR=${SCRIPT_DIR}/..
+echo ROOT_DIR ${ROOT_DIR}
+
+cd $ROOT_DIR
+
+#init git repo for GBS
+git init
+git add .
+git commit -m "commit needed for GBS"
+
+# trap ctrl-c and call ctrl_c()
+trap cleanup INT
+
+function cleanup() {
+    rm -rf ${ROOT_DIR}/.git
+    exit 0
+}
+
+gbs --conf ${SCRIPT_DIR}/gbs.conf build -A aarch64 --include-all --threads 1
+
+#remove temporary files
+cleanup
diff --git a/network-manager/scripts/deploy.sh b/network-manager/scripts/deploy.sh
new file mode 100755 (executable)
index 0000000..e2cf7e1
--- /dev/null
@@ -0,0 +1,20 @@
+#!/bin/bash
+
+SCRIPT_PATH="$(readlink -m ${0})"
+CONTROL_DIR="${SCRIPT_PATH%/*/*}/scripts"
+GBS_ROOT=~/GBS_ROOT_3.0
+
+TARGET_ARCH=aarch64
+
+GBS_RPMS_DIR=${GBS_ROOT}/local/repos/tizen_phone_arm64_3_0/${TARGET_ARCH}/RPMS
+
+sdb root on
+sdb shell mount -o remount,rw /
+sdb shell "id"
+
+RPMS_TO_PUSH="${GBS_RPMS_DIR}/nwmanager-*.rpm"
+sdb push ${RPMS_TO_PUSH} /tmp/
+
+sdb shell "rpm -Uvi --nodeps --force --replacefiles /tmp/nwmanager-*.rpm"
+
+sdb shell "/opt/usr/apps/network-manager/test"
diff --git a/network-manager/scripts/gbs.conf b/network-manager/scripts/gbs.conf
new file mode 100644 (file)
index 0000000..1f83366
--- /dev/null
@@ -0,0 +1,37 @@
+[general]
+#profile = profile.Main2017_KantM
+profile = profile.tizen_phone_arm64_3_0
+
+[obs.tizentv]
+url = https://168.219.241.169/api
+user = obs_viewer
+passwdx = QlpoOTFBWSZTWRLL1vsAAASLgCEgAACSIJmAIAAxA0DQKZMGnqnmfEjRAP8XckU4UJASy9b7
+
+[repo.base_Main2017]
+url=http://10.103.211.119/tizen-rsa/tizen-3.0-base-main2017/standard/latest/repos/base/armv7l/packages/
+[repo.local_Main2017]
+url=~/GBS_ROOT_3.0/local/repos/Main2017/armv7l
+[repo.product_Main2017_KantM]
+url=http://10.103.211.119/releases/tizen-3.0-product-main2017/product/KantM/latest/repos/product/armv7l/packages/
+
+[profile.Main2017_KantM]
+obs = obs.tizentv
+repos = repo.product_Main2017_KantM, repo.base_Main2017, repo.local_Main2017
+buildroot = ~/GBS_ROOT_3.0
+
+[obs.tizen_3.0]
+url = https://api.tizen.org
+
+
+[repo.base.tizen_3.0_arm64]
+#url=http://download.tizen.org/snapshots/tizen/3.0.m2-base/latest/repos/arm64/packages/
+url=http://download.tizen.org/snapshots/tizen/3.0-base/latest/repos/arm64/packages/
+
+[repo.tizen_3.0_arm64]
+url=http://download.tizen.org/snapshots/tizen/3.0.m2-mobile/latest/repos/arm64-wayland/packages/
+#url=http://download.tizen.org/snapshots/tizen/3.0-common/latest/repos/arm64-wayland/packages/
+
+[profile.tizen_phone_arm64_3_0]
+obs = obs.tizen_3.0
+repos = repo.base.tizen_3.0_arm64, repo.tizen_3.0_arm64
+buildroot = ~/GBS_ROOT_3.0
\ No newline at end of file
diff --git a/network-manager/test/CMakeLists.txt b/network-manager/test/CMakeLists.txt
new file mode 100644 (file)
index 0000000..4d27974
--- /dev/null
@@ -0,0 +1,21 @@
+get_filename_component(ProjectId ${CMAKE_CURRENT_SOURCE_DIR} NAME)
+string(REPLACE " " "_" ProjectId ${ProjectId})
+project(${ProjectId})
+
+
+include_directories (
+    ${NETWORK_MANAGER_LIB}/REST/inc
+)
+
+add_executable (${PROJECT_NAME} test_all.cpp test_REST.cpp)
+
+add_dependencies (${PROJECT_NAME} ${NETWORK_MANAGER_LIB_PROJECT_NAME})
+
+set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
+
+target_link_libraries(${PROJECT_NAME} gtest ${NETWORK_MANAGER_LIB_PROJECT_NAME} pthread)
+
+install(TARGETS ${PROJECT_NAME} DESTINATION ${TESTS_DIR})
+
+message(STATUS "Configuring: " ${ProjectId})
+message(STATUS "CMAKE_CXX_FLAGS: " ${CMAKE_CXX_FLAGS})
diff --git a/network-manager/test/test_REST.cpp b/network-manager/test/test_REST.cpp
new file mode 100644 (file)
index 0000000..42e9f1f
--- /dev/null
@@ -0,0 +1,17 @@
+#include <iostream>
+#include <gtest/gtest.h>
+#include <rest_helper.h>
+#include <string>
+
+using namespace std;
+
+
+TEST(test_REST, simple_get)
+{
+    network::RestHelper get_request("http://example.com");
+    string uri("/");
+    string response;
+    network::RestHelper::Params params;
+    ASSERT_EQ(network::RestHelper::REST_SUCCESS, get_request.GetRequest(params, uri, response));
+    cout << response << endl;
+}
diff --git a/network-manager/test/test_all.cpp b/network-manager/test/test_all.cpp
new file mode 100644 (file)
index 0000000..5cee3cb
--- /dev/null
@@ -0,0 +1,9 @@
+#include <iostream>
+
+#include <gtest/gtest.h>
+
+int main(int argc, char** argv)
+{
+    ::testing::InitGoogleTest(&argc, argv);
+    return RUN_ALL_TESTS();
+}
diff --git a/network-manager/test/tests.manifest b/network-manager/test/tests.manifest
new file mode 100644 (file)
index 0000000..75b0fa5
--- /dev/null
@@ -0,0 +1,5 @@
+<manifest>
+    <request>
+        <domain name="_"/>
+    </request>
+</manifest>