Commit c5b20a8c authored by Francis Dupont's avatar Francis Dupont

[204-move-models-] Checkpoint: moved modules, added revisions, updated pretests

parent 895fd85b
...@@ -1659,6 +1659,8 @@ AC_CONFIG_FILES([Makefile ...@@ -1659,6 +1659,8 @@ AC_CONFIG_FILES([Makefile
src/share/database/scripts/pgsql/upgrade_3.2_to_3.3.sh src/share/database/scripts/pgsql/upgrade_3.2_to_3.3.sh
src/share/database/scripts/pgsql/upgrade_3.3_to_4.0.sh src/share/database/scripts/pgsql/upgrade_3.3_to_4.0.sh
src/share/database/scripts/pgsql/upgrade_4.0_to_5.0.sh src/share/database/scripts/pgsql/upgrade_4.0_to_5.0.sh
src/share/yang/Makefile
src/share/yang/modules/Makefile
tools/Makefile tools/Makefile
tools/path_replacer.sh tools/path_replacer.sh
]) ])
......
...@@ -64,7 +64,8 @@ libkea_yang_include_HEADERS = \ ...@@ -64,7 +64,8 @@ libkea_yang_include_HEADERS = \
translator_pool.h \ translator_pool.h \
translator_shared_network.h \ translator_shared_network.h \
translator_subnet.h \ translator_subnet.h \
yang_models.h yang_models.h \
yang_revisions.h
EXTRA_DIST = yang.dox EXTRA_DIST = yang.dox
# Distribute yang modules. # Distribute yang modules.
......
...@@ -2,7 +2,10 @@ CLEANFILES = *.gcno *.gcda ...@@ -2,7 +2,10 @@ CLEANFILES = *.gcno *.gcda
TESTS = sysrepo_setup_tests TESTS = sysrepo_setup_tests
sysrepo_setup_tests_SOURCES = sysrepo_setup_tests.cc sysrepo_setup_tests_SOURCES = sysrepo_setup_tests.cc
sysrepo_setup_tests_CPPFLAGS = $(SYSREPO_CPPFLAGS) -DSYSREPO_REPO=\"@SYSREPO_REPO@\" sysrepo_setup_tests_CPPFLAGS = -I$(top_builddir)/src/lib
sysrepo_setup_tests_CPPFLAGS += -I$(top_srcdir)/src/lib
sysrepo_setup_tests_CPPFLAGS += $(SYSREPO_CPPFLAGS)
sysrepo_setup_tests_CPPFLAGS += -DSYSREPO_REPO=\"@SYSREPO_REPO@\"
sysrepo_setup_tests_LDFLAGS = $(AM_LDFLAGS) sysrepo_setup_tests_LDFLAGS = $(AM_LDFLAGS)
sysrepo_setup_tests_LDADD = $(SYSREPO_LIBS) sysrepo_setup_tests_LDADD = $(SYSREPO_LIBS)
......
...@@ -6,6 +6,8 @@ ...@@ -6,6 +6,8 @@
#include <config.h> #include <config.h>
#include <yang/yang_revisions.h>
#ifndef HAVE_PRE_0_7_6_SYSREPO #ifndef HAVE_PRE_0_7_6_SYSREPO
#include <sysrepo-cpp/Session.hpp> #include <sysrepo-cpp/Session.hpp>
#else #else
...@@ -18,31 +20,46 @@ using namespace std; ...@@ -18,31 +20,46 @@ using namespace std;
#ifndef HAVE_PRE_0_7_6_SYSREPO #ifndef HAVE_PRE_0_7_6_SYSREPO
using namespace sysrepo; using namespace sysrepo;
#endif #endif
using namespace isc::yang;
/// Not using libyang headers, e.g. yang_models.h.
const string TEST_MODULE = "keatest-module";
const string IETF_TYPES = "ietf-inet-types";
const string YANG_TYPES = "ietf-yang-types";
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";
const string REPOSITORY = SYSREPO_REPO; const string REPOSITORY = SYSREPO_REPO;
/// @brief Returns nicely formed error message if module is missing /// @brief Returns nicely formed error message if module is missing
/// ///
/// @param name name of the YANG module to complain about /// @param name name of the YANG module to complain about
/// #param revision revision of the YANG module
/// @return a text explaining what the problem is and how to fix it /// @return a text explaining what the problem is and how to fix it
string missingModuleText(const string& name) { string missingModuleText(const string& name, const string& revision) {
stringstream tmp; stringstream tmp;
tmp << "ERROR: YANG model " << name << " is not installed." << endl tmp << "ERROR: YANG module " << name << " is not installed." << endl
<< "The environment is not suitable for running unit-tests." << endl << "The environment is not suitable for running unit-tests." << endl
<< "Please locate " << name << ".yang, change to its directory and " << "Please locate " << name << "@" << revision << ".yang, "
<< "issue the following command:" << endl << endl << "change to its directory and issue the following command:"
<< endl << endl
<< "# sysrepoctl -i -s " << REPOSITORY << "/yang " << "# sysrepoctl -i -s " << REPOSITORY << "/yang "
<< "-s . -g " << name << ".yang" << endl << "-s . -g " << name << "@" << revision << ".yang" << endl
<< endl << endl;
return (tmp.str());
}
/// @brief Returns nicely formed error message if module does not have
/// the expected revision.
///
/// @param name name of the YANG module to complain about
/// @param expected expected revision of the YANG module
/// @param got got (bad) revision of the YANG module
string badRevisionModuleText(const string& name, const string& expected,
const string& got) {
stringstream tmp;
tmp << "ERROR: YANG module " << name << " is not installed with the right "
<< "revision: expected " << expected << " but got " << got << endl
<< "Please remove the module " << name << " and re-install it: "
<< "Please locate " << name << "@" << expected << ".yang, " << endl
<< "change to its directory and issue the following commands:"
<< endl << endl
<< "# sysrepoctl -u -m " << name << endl
<< "# sysrepoctl -i -s " << REPOSITORY << "/yang "
<< "-s . -g " << name << "@" << expected << ".yang" << endl
<< endl << endl; << endl << endl;
return (tmp.str()); return (tmp.str());
} }
...@@ -81,86 +98,44 @@ int main() { ...@@ -81,86 +98,44 @@ int main() {
exit(-3); exit(-3);
} }
bool found_test = false; map<string, bool> found;
bool found_ietf_types = false; map<string, string> got;
bool found_yang_types =false; for (auto modrev : YANG_REVISIONS) {
bool found_ietf = false; found[modrev.first] = 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) { for (size_t i = 0; i < schemas->schema_cnt(); ++i) {
string module = schemas->schema(i)->module_name(); string module = schemas->schema(i)->module_name();
size_t rev = module.find("@"); if (YANG_REVISIONS.count(module)) {
if (rev != string::npos) { found[module] = true;
module = module.substr(0, rev); if (!schemas->schema(i)->revision() ||
} !schemas->schema(i)->revision()->revision()) {
if (module == TEST_MODULE) { got[module] = "none";
found_test = true; } else {
} else if (module == IETF_TYPES) { string rev = schemas->schema(i)->revision()->revision();
found_ietf_types = true; got[module] = rev;
} else if (module == YANG_TYPES) { }
found_yang_types = 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;
} }
} }
int exit_code = 0; int exit_code = 0;
if (!found_test || for (auto modfnd : found) {
!found_ietf_types || !found_yang_types || string rev = YANG_REVISIONS.at(modfnd.first);
!found_ietf || !found_kea4 || !found_kea6 || !found_keaca || if (!modfnd.second) {
!found_kea2) { if (exit_code > -4) {
exit_code = -4; exit_code = -4;
} }
--exit_code;
if (!found_test) { cerr << missingModuleText(modfnd.first, rev);
cerr << missingModuleText(TEST_MODULE); } else if (rev != got[modfnd.first]) {
--exit_code; if (exit_code > -40) {
} exit_code += -40;
} else {
if (!found_ietf_types) { exit_code += -10;
cerr << missingModuleText(IETF_TYPES); }
--exit_code; cerr << badRevisionModuleText(modfnd.first, rev, got[modfnd.first]);
} }
if (!found_yang_types) {
cerr << missingModuleText(YANG_TYPES);
--exit_code;
}
if (!found_ietf) {
cerr << missingModuleText(IETF_MODULE);
--exit_code;
}
if (!found_kea4) {
cerr << missingModuleText(KEA_DHCP4_MODULE);
--exit_code;
}
if (!found_kea6) {
cerr << missingModuleText(KEA_DHCP6_MODULE);
--exit_code;
}
if (!found_keaca) {
cerr << missingModuleText(KEA_CTRL_AGENT_MODULE);
--exit_code;
}
if (!found_kea2) {
cerr << missingModuleText(KEA_D2_MODULE);
--exit_code;
} }
try { try {
......
...@@ -12,8 +12,6 @@ CLEANFILES = *.gcno *.gcda ...@@ -12,8 +12,6 @@ CLEANFILES = *.gcno *.gcda
TESTS_ENVIRONMENT = \ TESTS_ENVIRONMENT = \
$(LIBTOOL) --mode=execute $(VALGRIND_COMMAND) $(LIBTOOL) --mode=execute $(VALGRIND_COMMAND)
EXTRA_DIST = keatest-module.yang
TESTS = TESTS =
if HAVE_GTEST if HAVE_GTEST
TESTS += run_unittests TESTS += run_unittests
......
...@@ -4,8 +4,8 @@ ...@@ -4,8 +4,8 @@
// License, v. 2.0. If a copy of the MPL was not distributed with this // 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/. // file, You can obtain one at http://mozilla.org/MPL/2.0/.
#ifndef ISC_YANG_MODELS #ifndef ISC_YANG_MODELS_H
#define ISC_YANG_MODELS 1 #define ISC_YANG_MODELS_H 1
#include <string> #include <string>
...@@ -29,9 +29,9 @@ static const std::string KEA_DHCP_DDNS = "kea-dhcp-ddns"; ...@@ -29,9 +29,9 @@ static const std::string KEA_DHCP_DDNS = "kea-dhcp-ddns";
/// This model is currently in prototype phase. It will be developed /// This model is currently in prototype phase. It will be developed
/// by ISC in the near future. /// by ISC in the near future.
static const std::string KEA_CTRL_AGENT = "kea-ctrl-agent"; static const std::string KEA_CTRL_AGENT = "kea-ctrl-agent";
}; // end of namespace isc::yang }; // end of namespace isc::yang
}; // end of namespace isc }; // end of namespace isc
#endif // ISC_TRANSLATOR_POOL_H #endif // ISC_YANG_MODELS_H
// 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 ISC_YANG_REVISIONS_H
#define ISC_YANG_REVISIONS_H 1
#include <map>
#include <string>
namespace isc {
namespace yang {
// Table of module name / revision.
static const std::map<std::string, std::string> YANG_REVISIONS = {
// Should be generated automatically.
// cf src/share/yang/modules/README
{ "ietf-dhcpv6-types", "2018-09-04" },
{ "ietf-dhcpv6-options", "2018-09-04" },
{ "ietf-dhcpv6-server", "2018-09-04" },
{ "kea-types", "2018-11-20" },
{ "kea-logging", "2018-11-20" },
{ "kea-dhcp-types", "2018-11-20" },
{ "kea-dhcp4-server", "2018-11-20" },
{ "kea-dhcp6-server", "2018-11-20" },
{ "kea-ctrl-agent", "2018-11-20" },
{ "kea-dhcp-ddns", "2018-11-20" },
{ "keatest-module", "2018-11-20" }
};
}; // end of namespace isc::yang
}; // end of namespace isc
#endif // ISC_YANG_REVISIONS_H
SUBDIRS = database SUBDIRS = database yang
SUBDIRS = .
yangmodulesdir = ${datarootdir}/${PACKAGE_NAME}/yang/modules
yangmodules_DATA = ietf-dhcpv6-client@2018-09-04.yang
yangmodules_DATA += ietf-interfaces@2014-05-08.yang
yangmodules_DATA += ietf-dhcpv6-options@2018-09-04.yang
yangmodules_DATA += ietf-dhcpv6-relay@2018-09-04.yang
yangmodules_DATA += ietf-dhcpv6-server@2018-09-04.yang
yangmodules_DATA += ietf-dhcpv6-types@2018-09-04.yang
yangmodules_DATA += ietf-inet-types@2013-07-15.yang
yangmodules_DATA += ietf-yang-types@2013-07-15.yang
yangmodules_DATA += kea-ctrl-agent@2018-11-20.yang
yangmodules_DATA += kea-dhcp-ddns@2018-11-20.yang
yangmodules_DATA += kea-dhcp-types@2018-11-20.yang
yangmodules_DATA += kea-dhcp4-server@2018-11-20.yang
yangmodules_DATA += kea-dhcp6-server@2018-11-20.yang
yangmodules_DATA += kea-logging@2018-11-20.yang
yangmodules_DATA += kea-types@2018-11-20.yang
EXTRA_DIST = ${yangmodules_DATA}
Developer tools:
Get revision from file content:
yanglint -f yin xxx | grep '<revision date=' | head -1 | sed \
's/.*<revision date="\([0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]\)".*/\1/'
Get revision from file name:
echo xxx | sed 's/.*@\([0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]\)\..*/\1/'
Get hash:
yanglint -f yin xxx | openssl dgst -sha256
Check revisions:
for m in *.yang
do
rev1=`yanglint -f yin $m | grep '<revision date=' | head -1 | sed \
's/.*<revision date="\([0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]\)".*/\1/'`
rev2=`echo $m | sed \
's/.*@\([0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]\)\..*/\1/'`
if test $rev1 != $rev2
then
echo revision mismatch on $m
fi
done
Check hashes:
for m in *.yang
do
hash1=`yanglint -f yin $m | openssl dgst -sha256`
h=hashes/`basename $m .yang`.hash
if test -f $h
then
hash2=`cat $h`
if test $hash1 != $hash2
then
echo hash mismatch on $m
fi
else
echo missing hash for $m
fi
done
Build module / revision table:
for m in ietf-dhcpv6-types*.yang \
ietf-dhcpv6-options*.yang \
ietf-dhcpv6-server*.yang \
kea-types*.yang \
kea-logging*.yang \
kea-dhcp-types*.yang \
kea-dhcp4-server*.yang \
kea-dhcp6-server*.yang \
kea-ctrl-agent*.yang \
kea-dhcp-ddns*.yang \
keatest-module*.yang \
end-marker
do
if test $m = "end-marker"
then
echo '{ "", "" }'
else
b=`echo $m | sed 's/\(.*\)@.*/\1/'`
r=`echo $m | sed 's/.*@\(.*\)\.yang/\1/'`
echo '{ "'$b'", "'$r'" },'
fi
done
461ea3c5d65a212413437d52bd328a31591f7cf0b890aec920af7b793deaf749
deaf2a9c68b0cf88c6d2080036e50eded5c2356d062f339df44232f5cb240da6
1a18c64a05cf4295864e2e9871b811b9b4fdf30568f0ce14de045a6af9d04450
474fcc1cf5a017028796d37240491d72d6a10511539554a709bf877de54c8947
2b46b5bb323d062a3432d726187f5f283a67669379af2ef496bb473167552718
9ba53b11ecce24a3b878a816555efd8f6559bbcbb5179c62c48af91598744b9e
89386b4a0f7d8b7b56c402b61f577667bf6372c51040cae77a7aa569f63a5b1a
0e69553a19dff434f563e5f10fac3dd9b87b5d49d73b92fa11453f9f8e6e2c0b
a3e7356b8de165c21ef9bcbc068327cd31e97b59117f93bb18b795e6fdc20dbd
672e04e624c8f346981c55bd4ea80fd959af29dbfb6d2e42585376424e4a63f7
2dbc45c8947755ebdf0d3922367c0d4b0becc53c9def5befa8a550fed76b9e3c
5ab378fcd3acc72e5e63b06b05f67533da9650c7b4839933d026befb82bd34a5
c7cff2bcfc5bf43ac4dbaabe675475ec95b2a98782d96d84221b92f2ba9e59fb
d1ade30ec0ebee3106d0fd5ae6e6754909b6f94bd1fdd74b141541d31f71bd50
3652d2e7e441450c625e66e7c8d0dc25dd9883748fe0559590d8a9c0c9906cd9
f4a46d17ce7791f9d12d0906e1ed8c4b424b29146b5fd5e097663a6d9d388264
This diff is collapsed.
...@@ -10,6 +10,11 @@ module keatest-module { ...@@ -10,6 +10,11 @@ module keatest-module {
contact contact
"kea-dev@lists.isc.org"; "kea-dev@lists.isc.org";
revision 2018-11-20 {
description "Initial revision";
reference "";
}
container container { container container {
config true; config true;
list list { list list {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment