blob: ef3c5dbe4c7d07981475468b0749ccdd6ec2e349 [file] [log] [blame]
Václav Kubernát48e9dfa2020-07-08 10:55:12 +02001/*
2 * Copyright (C) 2020 CESNET, https://photonics.cesnet.cz/
3 *
4 * Written by Václav Kubernát <kubernat@cesnet.cz>
5 *
6*/
Václav Kubernáte7248b22020-06-26 15:38:59 +02007#include <boost/algorithm/string/predicate.hpp>
Václav Kubernát48e9dfa2020-07-08 10:55:12 +02008#include "proxy_datastore.hpp"
Václav Kubernáte7248b22020-06-26 15:38:59 +02009#include "yang_schema.hpp"
Václav Kubernát48e9dfa2020-07-08 10:55:12 +020010
Václav Kubernáte7248b22020-06-26 15:38:59 +020011ProxyDatastore::ProxyDatastore(const std::shared_ptr<DatastoreAccess>& datastore, std::function<std::shared_ptr<DatastoreAccess>(const std::shared_ptr<DatastoreAccess>&)> createTemporaryDatastore)
Václav Kubernát48e9dfa2020-07-08 10:55:12 +020012 : m_datastore(datastore)
Václav Kubernáte7248b22020-06-26 15:38:59 +020013 , m_createTemporaryDatastore(createTemporaryDatastore)
Václav Kubernát48e9dfa2020-07-08 10:55:12 +020014{
15}
16
17DatastoreAccess::Tree ProxyDatastore::getItems(const std::string& path) const
18{
Václav Kubernáte7248b22020-06-26 15:38:59 +020019 return pickDatastore(path)->getItems(path);
Václav Kubernát48e9dfa2020-07-08 10:55:12 +020020}
21
22void ProxyDatastore::setLeaf(const std::string& path, leaf_data_ value)
23{
Václav Kubernáte7248b22020-06-26 15:38:59 +020024 pickDatastore(path)->setLeaf(path, value);
Václav Kubernát48e9dfa2020-07-08 10:55:12 +020025}
26
27void ProxyDatastore::createItem(const std::string& path)
28{
Václav Kubernáte7248b22020-06-26 15:38:59 +020029 pickDatastore(path)->createItem(path);
Václav Kubernát48e9dfa2020-07-08 10:55:12 +020030}
31
32void ProxyDatastore::deleteItem(const std::string& path)
33{
Václav Kubernáte7248b22020-06-26 15:38:59 +020034 pickDatastore(path)->deleteItem(path);
Václav Kubernát48e9dfa2020-07-08 10:55:12 +020035}
36
37void ProxyDatastore::moveItem(const std::string& source, std::variant<yang::move::Absolute, yang::move::Relative> move)
38{
Václav Kubernáte7248b22020-06-26 15:38:59 +020039 pickDatastore(source)->moveItem(source, move);
Václav Kubernát48e9dfa2020-07-08 10:55:12 +020040}
41
42void ProxyDatastore::commitChanges()
43{
44 m_datastore->commitChanges();
45}
46
47void ProxyDatastore::discardChanges()
48{
49 m_datastore->discardChanges();
50}
51
52void ProxyDatastore::copyConfig(const Datastore source, const Datastore destination)
53{
54 m_datastore->copyConfig(source, destination);
55}
56
57std::string ProxyDatastore::dump(const DataFormat format) const
58{
59 return m_datastore->dump(format);
60}
61
Václav Kubernátb3960f82020-12-01 03:21:48 +010062void ProxyDatastore::initiate(const std::string& path)
Václav Kubernáte7248b22020-06-26 15:38:59 +020063{
64 if (m_inputDatastore) {
Václav Kubernátb3960f82020-12-01 03:21:48 +010065 throw std::runtime_error("RPC/action input already in progress (" + m_inputPath + ")");
Václav Kubernáte7248b22020-06-26 15:38:59 +020066 }
67 m_inputDatastore = m_createTemporaryDatastore(m_datastore);
Václav Kubernátb3960f82020-12-01 03:21:48 +010068 m_inputPath = path;
69 m_inputDatastore->createItem(path);
Václav Kubernátaa4250a2020-07-22 00:02:23 +020070}
71
72DatastoreAccess::Tree ProxyDatastore::execute()
Václav Kubernáte7248b22020-06-26 15:38:59 +020073{
74 if (!m_inputDatastore) {
Václav Kubernátaa4250a2020-07-22 00:02:23 +020075 throw std::runtime_error("No RPC/action input in progress");
Václav Kubernáte7248b22020-06-26 15:38:59 +020076 }
77 auto inputData = m_inputDatastore->getItems("/");
78 m_inputDatastore = nullptr;
Václav Kubernátb3960f82020-12-01 03:21:48 +010079 return m_datastore->execute(m_inputPath, inputData);
Václav Kubernáte7248b22020-06-26 15:38:59 +020080}
81
Václav Kubernátaa4250a2020-07-22 00:02:23 +020082void ProxyDatastore::cancel()
Václav Kubernáte7248b22020-06-26 15:38:59 +020083{
84 m_inputDatastore = nullptr;
85}
86
Václav Kubernát48e9dfa2020-07-08 10:55:12 +020087std::shared_ptr<Schema> ProxyDatastore::schema() const
88{
89 return m_datastore->schema();
90}
Václav Kubernáte7248b22020-06-26 15:38:59 +020091
92std::shared_ptr<DatastoreAccess> ProxyDatastore::pickDatastore(const std::string& path) const
93{
Václav Kubernátb3960f82020-12-01 03:21:48 +010094 if (!m_inputDatastore || !boost::starts_with(path, m_inputPath)) {
Václav Kubernáte7248b22020-06-26 15:38:59 +020095 return m_datastore;
96 } else {
97 return m_inputDatastore;
98 }
99}