Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Kea
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
445
Issues
445
List
Boards
Labels
Service Desk
Milestones
Merge Requests
71
Merge Requests
71
Operations
Operations
Incidents
Packages & Registries
Packages & Registries
Container Registry
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
ISC Open Source Projects
Kea
Commits
59bf841e
Commit
59bf841e
authored
Sep 23, 2018
by
Francis Dupont
Browse files
Options
Browse Files
Download
Plain Diff
[65-libyang-option-data-rebased] Rebasing on last master
parents
a388c647
238b49f3
Changes
13
Hide whitespace changes
Inline
Side-by-side
Showing
13 changed files
with
746 additions
and
71 deletions
+746
-71
configure.ac
configure.ac
+1
-0
src/lib/yang/Makefile.am
src/lib/yang/Makefile.am
+5
-2
src/lib/yang/adaptor.h
src/lib/yang/adaptor.h
+2
-2
src/lib/yang/pretests/Makefile.am
src/lib/yang/pretests/Makefile.am
+9
-0
src/lib/yang/pretests/sysrepo_setup_tests.cc
src/lib/yang/pretests/sysrepo_setup_tests.cc
+120
-0
src/lib/yang/tests/Makefile.am
src/lib/yang/tests/Makefile.am
+2
-0
src/lib/yang/tests/sysrepo_setup.h
src/lib/yang/tests/sysrepo_setup.h
+67
-0
src/lib/yang/tests/translator_option_data_unittests.cc
src/lib/yang/tests/translator_option_data_unittests.cc
+149
-0
src/lib/yang/tests/translator_unittests.cc
src/lib/yang/tests/translator_unittests.cc
+0
-50
src/lib/yang/translator.h
src/lib/yang/translator.h
+9
-9
src/lib/yang/translator_option_data.cc
src/lib/yang/translator_option_data.cc
+206
-0
src/lib/yang/translator_option_data.h
src/lib/yang/translator_option_data.h
+168
-0
src/lib/yang/yang.dox
src/lib/yang/yang.dox
+8
-8
No files found.
configure.ac
View file @
59bf841e
...
...
@@ -1602,6 +1602,7 @@ AC_CONFIG_FILES([Makefile
src/lib/util/threads/tests/Makefile
src/lib/util/unittests/Makefile
src/lib/yang/Makefile
src/lib/yang/pretests/Makefile
src/lib/yang/tests/Makefile
src/share/Makefile
src/share/database/Makefile
...
...
src/lib/yang/Makefile.am
View file @
59bf841e
SUBDIRS
=
.
tests
SUBDIRS
=
.
pretests
tests
AM_CPPFLAGS
=
-I
$(top_srcdir)
/src/lib
-I
$(top_builddir)
/src/lib
AM_CPPFLAGS
+=
$(BOOST_INCLUDES)
$(SYSREPO_CPPFLAGS)
...
...
@@ -8,6 +8,8 @@ lib_LTLIBRARIES = libkea-yang.la
libkea_yang_la_SOURCES
=
adaptor.cc adaptor.h
libkea_yang_la_SOURCES
+=
sysrepo_error.h
libkea_yang_la_SOURCES
+=
translator.cc translator.h
libkea_yang_la_SOURCES
+=
translator_option_data.cc
libkea_yang_la_SOURCES
+=
translator_option_data.h
libkea_yang_la_LIBADD
=
$(top_builddir)
/src/lib/asiolink/libkea-asiolink.la
libkea_yang_la_LIBADD
+=
$(top_builddir)
/src/lib/cc/libkea-cc.la
...
...
@@ -24,7 +26,8 @@ libkea_yang_includedir = $(pkgincludedir)/yang
libkea_yang_include_HEADERS
=
\
adaptor.h
\
sysrepo_error.h
\
translator.h
translator.h
\
translator_option_data.h
EXTRA_DIST
=
yang.dox
...
...
src/lib/yang/adaptor.h
View file @
59bf841e
...
...
@@ -21,10 +21,10 @@ public:
{}
};
/// @brief JSON adaptor between canonical Kea and Y
ang
models.
/// @brief JSON adaptor between canonical Kea and Y
ANG
models.
///
/// An adaptor slightly modifies a JSON configuration between canonical Kea
/// what required or rendered by a Y
ang
model, e.g. moving a parameter
/// what required or rendered by a Y
ANG
model, e.g. moving a parameter
/// to/from a parent.
/// The basic adaptor provides a set of tools.
class
Adaptor
{
...
...
src/lib/yang/pretests/Makefile.am
0 → 100644
View file @
59bf841e
CLEANFILES
=
*
.gcno
*
.gcda
TESTS
=
sysrepo_setup_tests
sysrepo_setup_tests_SOURCES
=
sysrepo_setup_tests.cc
sysrepo_setup_tests_CPPFLAGS
=
$(SYSREPO_CPPFLAGS)
sysrepo_setup_tests_LDFLAGS
=
$(AM_LDFLAGS)
sysrepo_setup_tests_LDADD
=
$(SYSREPO_LIBS)
noinst_PROGRAMS
=
$(TESTS)
src/lib/yang/pretests/sysrepo_setup_tests.cc
0 → 100644
View file @
59bf841e
// Copyright (C) 2018 Internet Systems Consortium, Inc. ("ISC")
//
// This Source Code Form is subject to the terms of the Mozilla Public
// License, v. 2.0. If a copy of the MPL was not distributed with this
// file, You can obtain one at http://mozilla.org/MPL/2.0/.
#include <config.h>
#include <sysrepo-cpp/Session.h>
using
namespace
std
;
const
string
TEST_MODULE
=
"keatest-module"
;
const
string
IETF_MODULE
=
"ietf-dhcpv6-server"
;
const
string
KEA_DHCP4_MODULE
=
"kea-dhcp4-server"
;
const
string
KEA_DHCP6_MODULE
=
"kea-dhcp6-server"
;
const
string
KEA_CTRL_AGENT_MODULE
=
"kea-ctrl-agent"
;
const
string
KEA_D2_MODULE
=
"kea-dhcp-ddns"
;
/// @brief Checks sysrepo setup:
/// - connection establishment
/// - daemon required
/// - session establishment
/// - test module
/// - IETF module
/// - Kea modules.
int
main
()
{
S_Connection
conn
;
try
{
conn
.
reset
(
new
Connection
(
"sysrepo setup check"
));
}
catch
(
const
sysrepo_exception
&
ex
)
{
cerr
<<
"Can't connect to sysrepo: "
<<
ex
.
what
()
<<
endl
;
exit
(
-
1
);
}
try
{
conn
.
reset
(
new
Connection
(
"sysrepo setup check"
,
SR_CONN_DAEMON_REQUIRED
));
}
catch
(
const
sysrepo_exception
&
ex
)
{
cerr
<<
"Can't require sysrepo daemon: "
<<
ex
.
what
()
<<
endl
<<
endl
<<
"Sysrepo daemon is required or actions will be local to "
<<
"the local library instance"
<<
endl
;
exit
(
-
2
);
}
S_Session
sess
;
try
{
sess
.
reset
(
new
Session
(
conn
,
SR_DS_CANDIDATE
));
}
catch
(
const
sysrepo_exception
&
ex
)
{
cerr
<<
"Can't establish a sysrepo session: "
<<
ex
.
what
()
<<
endl
;
exit
(
-
3
);
}
S_Yang_Schemas
schemas
;
try
{
schemas
=
sess
->
list_schemas
();
}
catch
(
const
sysrepo_exception
&
ex
)
{
cerr
<<
"Can't list available schemas: "
<<
ex
.
what
()
<<
endl
;
}
bool
found_test
=
false
;
bool
found_ietf
=
false
;
bool
found_kea4
=
false
;
bool
found_kea6
=
false
;
bool
found_keaca
=
false
;
bool
found_kea2
=
false
;
for
(
size_t
i
=
0
;
i
<
schemas
->
schema_cnt
();
++
i
)
{
string
module
=
schemas
->
schema
(
i
)
->
module_name
();
size_t
rev
=
module
.
find
(
"@"
);
if
(
rev
!=
string
::
npos
)
{
module
=
module
.
substr
(
0
,
rev
);
}
if
(
module
==
TEST_MODULE
)
{
found_test
=
true
;
}
else
if
(
module
==
IETF_MODULE
)
{
found_ietf
=
true
;
}
else
if
(
module
==
KEA_DHCP4_MODULE
)
{
found_kea4
=
true
;
}
else
if
(
module
==
KEA_DHCP6_MODULE
)
{
found_kea6
=
true
;
}
else
if
(
module
==
KEA_CTRL_AGENT_MODULE
)
{
found_keaca
=
true
;
}
else
if
(
module
==
KEA_D2_MODULE
)
{
found_kea2
=
true
;
}
}
if
(
!
found_test
)
{
cerr
<<
"Module used in unit-tests "
<<
TEST_MODULE
<<
" is not installed. The environment is not suitable for "
<<
"running unit-tests. Please locate "
<<
TEST_MODULE
<<
".yang and issue the following command:"
<<
endl
<<
"sysrepoctl --i -g "
<<
TEST_MODULE
<<
".yang"
<<
endl
;
exit
(
-
4
);
}
if
(
!
found_ietf
)
{
cerr
<<
"Please install "
<<
IETF_MODULE
<<
" module"
<<
endl
;
exit
(
-
5
);
}
if
(
!
found_kea4
)
{
cerr
<<
"Please install "
<<
KEA_DHCP4_MODULE
<<
" module"
<<
endl
;
exit
(
-
6
);
}
if
(
!
found_kea6
)
{
cerr
<<
"Please install "
<<
KEA_DHCP6_MODULE
<<
" module"
<<
endl
;
exit
(
-
7
);
}
if
(
!
found_keaca
)
{
cerr
<<
"Please install "
<<
KEA_CTRL_AGENT_MODULE
<<
" module"
<<
endl
;
exit
(
-
8
);
}
if
(
!
found_kea2
)
{
cerr
<<
"Please install "
<<
KEA_D2_MODULE
<<
" module"
<<
endl
;
exit
(
-
9
);
}
exit
(
0
);
}
src/lib/yang/tests/Makefile.am
View file @
59bf841e
...
...
@@ -18,7 +18,9 @@ TESTS =
if
HAVE_GTEST
TESTS
+=
run_unittests
run_unittests_SOURCES
=
adaptor_unittests.cc
run_unittests_SOURCES
+=
sysrepo_setup.h
run_unittests_SOURCES
+=
translator_unittests.cc
run_unittests_SOURCES
+=
translator_option_data_unittests.cc
run_unittests_SOURCES
+=
run_unittests.cc
run_unittests_CPPFLAGS
=
$(AM_CPPFLAGS)
$(GTEST_INCLUDES)
run_unittests_LDFLAGS
=
$(AM_LDFLAGS)
$(GTEST_LDFLAGS)
...
...
src/lib/yang/tests/sysrepo_setup.h
0 → 100644
View file @
59bf841e
// Copyright (C) 2018 Internet Systems Consortium, Inc. ("ISC")
//
// This Source Code Form is subject to the terms of the Mozilla Public
// License, v. 2.0. If a copy of the MPL was not distributed with this
// file, You can obtain one at http://mozilla.org/MPL/2.0/.
#ifndef SYSREPO_SETUP_H
#define SYSREPO_SETUP_H
#include <config.h>
#include <yang/translator.h>
#include <gtest/gtest.h>
namespace
isc
{
namespace
yang
{
namespace
test
{
/// @brief Test Fixture temolate for translator tests.
///
/// @tparam Name The name of the translator to test.
/// @tparam Type The type of the translator to test.
template
<
char
const
*
Name
,
typename
Type
>
class
GenericTranslatorTest
:
public
::
testing
::
Test
{
public:
/// @brief Constructor.
GenericTranslatorTest
()
:
conn_
(),
sess_
(),
t_obj_
()
{
}
/// @brief useModel
///
/// Open a sysrepo session and create a translator object using
/// the given model.
///
/// @param model The model to use.
void
useModel
(
std
::
string
model
)
{
std
::
string
full_name
=
"translator "
+
std
::
string
(
Name
)
+
" unittests"
;
conn_
.
reset
(
new
Connection
(
full_name
.
c_str
()));
sess_
.
reset
(
new
Session
(
conn_
,
SR_DS_CANDIDATE
));
EXPECT_NO_THROW
(
t_obj_
.
reset
(
new
Type
(
sess_
,
model
)));
}
/// @brief Destructor.
///
/// Destroy all objects.
virtual
~
GenericTranslatorTest
()
{
t_obj_
.
reset
();
sess_
.
reset
();
conn_
.
reset
();
}
/// @brief Sysrepo connection.
S_Connection
conn_
;
/// @brief Sysrepo session.
S_Session
sess_
;
/// @brief Shared pointer to the transaction object.
boost
::
shared_ptr
<
Type
>
t_obj_
;
};
}
// namespace test
}
// namespace yang
}
// namespace isc
#endif // SYSREPO_SETUP_H
src/lib/yang/tests/translator_option_data_unittests.cc
0 → 100644
View file @
59bf841e
// Copyright (C) 2018 Internet Systems Consortium, Inc. ("ISC")
//
// This Source Code Form is subject to the terms of the Mozilla Public
// License, v. 2.0. If a copy of the MPL was not distributed with this
// file, You can obtain one at http://mozilla.org/MPL/2.0/.
#include <config.h>
#include <yang/translator_option_data.h>
#include <yang/tests/sysrepo_setup.h>
#include <gtest/gtest.h>
#include <sstream>
using
namespace
std
;
using
namespace
isc
;
using
namespace
isc
::
data
;
using
namespace
isc
::
yang
;
using
namespace
isc
::
yang
::
test
;
namespace
{
/// @brief Translator name.
extern
char
const
option_data_list
[]
=
"option data list"
;
/// @brief Test fixture class for @ref TranslatorOptionDataList.
class
TranslatorOptionDataListTest
:
public
GenericTranslatorTest
<
option_data_list
,
TranslatorOptionDataList
>
{
public:
/// Constructor.
TranslatorOptionDataListTest
()
{
}
/// Destructor (does nothing).
virtual
~
TranslatorOptionDataListTest
()
{
}
};
// This test verifies that an empty option data list can be properly
// translated from YANG to JSON.
TEST_F
(
TranslatorOptionDataListTest
,
getEmpty
)
{
useModel
(
"kea-dhcp4-server"
);
// Get the option data list and checks it is empty.
const
string
&
xpath
=
"/kea-dhcp4-server:config/option-data-list"
;
ConstElementPtr
options
;
EXPECT_NO_THROW
(
options
=
t_obj_
->
getOptionDataList
(
xpath
));
ASSERT_TRUE
(
options
);
ASSERT_EQ
(
Element
::
list
,
options
->
getType
());
EXPECT_EQ
(
0
,
options
->
size
());
}
// This test verifies that one option data can be properly translated
// from YANG to JSON.
TEST_F
(
TranslatorOptionDataListTest
,
get
)
{
useModel
(
"kea-dhcp6-server"
);
// Create the option code 100.
const
string
&
xpath
=
"/kea-dhcp6-server:config/option-data-list"
;
const
string
&
xoption
=
xpath
+
"/option-data[code='100'][space='dns']"
;
const
string
&
xformat
=
xoption
+
"/csv-format"
;
const
string
&
xdata
=
xoption
+
"/data"
;
const
string
&
xsend
=
xoption
+
"/always-send"
;
S_Val
s_false
(
new
Val
(
false
));
ASSERT_NO_THROW
(
sess_
->
set_item
(
xformat
.
c_str
(),
s_false
));
S_Val
s_data
(
new
Val
(
"12121212"
));
ASSERT_NO_THROW
(
sess_
->
set_item
(
xdata
.
c_str
(),
s_data
));
ASSERT_NO_THROW
(
sess_
->
set_item
(
xsend
.
c_str
(),
s_false
));
// Get the option data.
ConstElementPtr
option
;
EXPECT_NO_THROW
(
option
=
t_obj_
->
getOptionData
(
xoption
));
ASSERT_TRUE
(
option
);
EXPECT_EQ
(
"{
\"
always-send
\"
: false,
\"
code
\"
: 100,
\"
csv-format
\"
: false,
\"
data
\"
:
\"
12121212
\"
,
\"
space
\"
:
\"
dns
\"
}"
,
option
->
str
());
// Get the option data list.
ConstElementPtr
options
;
EXPECT_NO_THROW
(
options
=
t_obj_
->
getOptionDataList
(
xpath
));
ASSERT_TRUE
(
options
);
ASSERT_EQ
(
Element
::
list
,
options
->
getType
());
EXPECT_EQ
(
1
,
options
->
size
());
EXPECT_TRUE
(
option
->
equals
(
*
options
->
get
(
0
)));
}
// This test verifies that an empty option data list can be properly
// translated from JSON to YANG.
TEST_F
(
TranslatorOptionDataListTest
,
setEmpty
)
{
useModel
(
"kea-dhcp4-server"
);
// Set empty list.
const
string
&
xpath
=
"/kea-dhcp4-server:config/option-data-list"
;
ConstElementPtr
options
=
Element
::
createList
();
EXPECT_NO_THROW
(
t_obj_
->
setOptionDataList
(
xpath
,
options
));
// Get it back.
options
.
reset
();
EXPECT_NO_THROW
(
options
=
t_obj_
->
getOptionDataList
(
xpath
));
ASSERT_TRUE
(
options
);
EXPECT_EQ
(
0
,
options
->
size
());
}
// This test verifies that one option data can be properly translated
// from JSON to YANG.
TEST_F
(
TranslatorOptionDataListTest
,
set
)
{
useModel
(
"kea-dhcp6-server"
);
// Set one option data.
const
string
&
xpath
=
"/kea-dhcp6-server:config/option-data-list"
;
ElementPtr
options
=
Element
::
createList
();
ElementPtr
option
=
Element
::
createMap
();
option
->
set
(
"code"
,
Element
::
create
(
100
));
option
->
set
(
"space"
,
Element
::
create
(
string
(
"dns"
)));
option
->
set
(
"csv-format"
,
Element
::
create
(
false
));
option
->
set
(
"data"
,
Element
::
create
(
string
(
"12121212"
)));
option
->
set
(
"always-send"
,
Element
::
create
(
false
));
options
->
add
(
option
);
EXPECT_NO_THROW
(
t_obj_
->
setOptionDataList
(
xpath
,
options
));
// Get it back.
ConstElementPtr
got
;
EXPECT_NO_THROW
(
got
=
t_obj_
->
getOptionDataList
(
xpath
));
ASSERT_TRUE
(
got
);
ASSERT_EQ
(
1
,
got
->
size
());
EXPECT_TRUE
(
option
->
equals
(
*
got
->
get
(
0
)));
// Check the tree representation.
S_Tree
tree
;
EXPECT_NO_THROW
(
tree
=
sess_
->
get_subtree
(
"/kea-dhcp6-server:config"
));
ASSERT_TRUE
(
tree
);
string
expected
=
"kea-dhcp6-server:config (container)
\n
"
" |
\n
"
" -- option-data-list (container)
\n
"
" |
\n
"
" -- option-data (list instance)
\n
"
" |
\n
"
" -- code = 100
\n
"
" |
\n
"
" -- space = dns
\n
"
" |
\n
"
" -- data = 12121212
\n
"
" |
\n
"
" -- csv-format = false
\n
"
" |
\n
"
" -- always-send = false
\n
"
;
EXPECT_EQ
(
expected
,
tree
->
to_string
(
100
));
}
};
// end of anonymous namespace
src/lib/yang/tests/translator_unittests.cc
View file @
59bf841e
...
...
@@ -18,56 +18,6 @@ using namespace isc::yang;
namespace
{
const
std
::
string
TEST_MODULE
=
"keatest-module"
;
/// @brief checks if specified schema is installed and available in sysrepo
///
/// @name name of the schema to be checked (without .yang)
/// @verbose print installed schemas?
/// @return true if installed, false otherwise.
bool
schemaInstalled
(
const
std
::
string
&
name
,
bool
verbose
=
false
)
{
// Get a connection.
S_Connection
conn
(
new
Connection
(
"translator unittests"
));
// Get a session.
S_Session
sess
(
new
Session
(
conn
,
SR_DS_CANDIDATE
));
S_Yang_Schemas
schemas
=
sess
->
list_schemas
();
size_t
schema_cnt
=
schemas
->
schema_cnt
();
if
(
verbose
)
{
cout
<<
"There are "
<<
schema_cnt
<<
" YANG schema(s) installed:"
<<
endl
;
}
bool
found
=
false
;
for
(
int
i
=
0
;
i
<
schema_cnt
;
i
++
)
{
string
installed_name
(
schemas
->
schema
(
i
)
->
module_name
());
if
(
installed_name
==
name
)
{
found
=
true
;
}
if
(
verbose
)
{
std
::
cout
<<
"Schema "
<<
i
<<
": "
<<
installed_name
<<
endl
;
}
}
return
(
found
);
}
// This test verifies if the test schema is installed and accessible.
TEST
(
TranslatorBasicTest
,
environmentCheck1
)
{
EXPECT_TRUE
(
schemaInstalled
(
TEST_MODULE
))
<<
"
\n
ERROR: Module used in unit-tests "
<<
TEST_MODULE
<<
" is not installed. The environment is not suitable for
\n
"
<<
"ERROR: running unit-tests. Please locate "
<<
TEST_MODULE
<<
".yang "
<<
"and issue the following command:
\n
"
<<
"ERROR: sysrepoctl --install --yang="
<<
TEST_MODULE
<<
".yang
\n
"
<<
"ERROR:
\n
"
<<
"ERROR: Following tests will most likely fail.
\n
"
;
}
// Test constructor.
TEST
(
TranslatorBasicTest
,
constructor
)
{
// Get a connection.
...
...
src/lib/yang/translator.h
View file @
59bf841e
...
...
@@ -15,7 +15,7 @@
namespace
isc
{
namespace
yang
{
/// @brief Between Y
ang
and JSON translator class for basic values.
/// @brief Between Y
ANG
and JSON translator class for basic values.
class
TranslatorBasic
{
public:
...
...
@@ -27,7 +27,7 @@ public:
/// @brief Destructor.
virtual
~
TranslatorBasic
();
/// @brief Translate basic value from Y
ang
to JSON.
/// @brief Translate basic value from Y
ANG
to JSON.
///
/// @note Please don't use this outside tests.
///
...
...
@@ -36,7 +36,7 @@ public:
/// @throw NotImplemented when the value type is not supported.
static
isc
::
data
::
ElementPtr
value
(
S_Val
s_val
);
/// @brief Get and translate basic value from Y
ang
to JSON.
/// @brief Get and translate basic value from Y
ANG
to JSON.
///
/// @note Should be const as it is read only...
///
...
...
@@ -47,14 +47,14 @@ public:
/// @throw NotImplemented when the value type is not supported.
isc
::
data
::
ElementPtr
getItem
(
const
std
::
string
&
xpath
);
/// @brief Get and translate a list of basic values from Y
ang
to JSON.
/// @brief Get and translate a list of basic values from Y
ANG
to JSON.
///
/// @param xpath The xpath of the list of basic values.
/// @return The ListElement representing the leaf-list at xpath or
/// null when not found.
isc
::
data
::
ElementPtr
getItems
(
const
std
::
string
&
xpath
);
/// @brief Translate basic value from JSON to Y
ang
.
/// @brief Translate basic value from JSON to Y
ANG
.
///
/// @note Please don't use this outside tests.
///
...
...
@@ -62,7 +62,7 @@ public:
/// @param type The sysrepo type.
static
S_Val
value
(
isc
::
data
::
ConstElementPtr
elem
,
sr_type_t
type
);
/// @brief Translate and set basic value from JSON to Y
ang
.
/// @brief Translate and set basic value from JSON to Y
ANG
.
///
/// @param xpath The xpath of the basic value.
/// @param elem The JSON element.
...
...
@@ -70,20 +70,20 @@ public:
void
setItem
(
const
std
::
string
&
xpath
,
isc
::
data
::
ConstElementPtr
elem
,
sr_type_t
type
);
/// @brief Delete basic value from Y
ang
.
/// @brief Delete basic value from Y
ANG
.
///
/// @param xpath The xpath of the basic value.
void
delItem
(
const
std
::
string
&
xpath
);
/// List iterator methods keeping the session private.
/// @brief Get iterator over a Y
ang
list.
/// @brief Get iterator over a Y
ANG
list.
///
/// @param xpath The xpath of the list.
/// @return An S_Iter_Value pointer. Null is the list does not exist.
S_Iter_Value
getIter
(
const
std
::
string
&
xpath
);
/// @brief Get xpath of the next Y
ang
list item.
/// @brief Get xpath of the next Y
ANG
list item.
///
/// @param iter The iterator pointing to the previous element
/// @return The xpath of the next element. Empty string when at the end of the list.
...
...
src/lib/yang/translator_option_data.cc
0 → 100644
View file @
59bf841e
// Copyright (C) 2018 Internet Systems Consortium, Inc. ("ISC")
//
// This Source Code Form is subject to the terms of the Mozilla Public
// License, v. 2.0. If a copy of the MPL was not distributed with this
// file, You can obtain one at http://mozilla.org/MPL/2.0/.
#include <yang/translator_option_data.h>
#include <yang/adaptor.h>
#include <sstream>
using
namespace
std
;
using
namespace
isc
::
data
;
namespace
isc
{
namespace
yang
{
TranslatorOptionData
::
TranslatorOptionData
(
S_Session
session
,
const
string
&
model
)
:
TranslatorBasic
(
session
),
model_
(
model
)
{
}
TranslatorOptionData
::~
TranslatorOptionData
()
{
}
ElementPtr
TranslatorOptionData
::
getOptionData
(
const
string
&
xpath
)
{
try
{
if
((
model_
==
"kea-dhcp4-server"
)
||
(
model_
==
"kea-dhcp6-server"
))
{
return
(
getOptionDataKea
(
xpath
));
}
}
catch
(
const
sysrepo_exception
&
ex
)
{
isc_throw
(
SysrepoError
,
"sysrepo error getting option data at '"
<<
xpath
<<
"': "
<<
ex
.
what
());
}
isc_throw
(
NotImplemented
,
"getOptionData not implemented for the model: "
<<
model_
);
}
ElementPtr
TranslatorOptionData
::
getOptionDataKea
(
const
string
&
xpath
)
{
ConstElementPtr
code
=
getItem
(
xpath
+
"/code"
);
ConstElementPtr
space
=
getItem
(
xpath
+
"/space"
);
if
(
!
code
||
!
space
)
{
// Can't happen as code and space are the keys.
isc_throw
(
Unexpected
,
"getOptionDataKea requires code and space: "
<<
xpath
);
}
ElementPtr
result
=
Element
::
createMap
();
result
->
set
(
"code"
,
code
);
result
->
set
(
"space"
,
space
);
ConstElementPtr
name
=
getItem
(
xpath
+
"/name"
);
if
(
name
)
{
result
->
set
(
"name"
,
name
);
}
ConstElementPtr
data
=
getItem
(
xpath
+
"/data"
);
if
(
data
)
{
result
->
set
(
"data"
,
data
);
}
ConstElementPtr
format
=
getItem
(
xpath
+
"/csv-format"
);
if
(
format
)
{
result
->
set
(
"csv-format"
,
format
);
}
ConstElementPtr
send
=
getItem
(
xpath
+
"/always-send"
);
if
(
send
)
{
result
->
set
(
"always-send"
,
send
);
}
ConstElementPtr
context
=
getItem
(
xpath
+
"/user-context"
);
if
(
context
)
{
result
->
set
(
"user-context"
,
Element
::
fromJSON
(
context
->
stringValue
()));
}