blob: f212d451fbe21c47fde6cbca3beceff08b6a89b4 [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át2bed9522020-12-01 03:37:41 +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("/");
Václav Kubernát2bed9522020-12-01 03:37:41 +010078
79 auto out = m_datastore->execute(*m_inputPath, inputData);
80 cancel();
81
82 return out;
Václav Kubernáte7248b22020-06-26 15:38:59 +020083}
84
Václav Kubernátaa4250a2020-07-22 00:02:23 +020085void ProxyDatastore::cancel()
Václav Kubernáte7248b22020-06-26 15:38:59 +020086{
87 m_inputDatastore = nullptr;
Václav Kubernát2bed9522020-12-01 03:37:41 +010088 m_inputPath = std::nullopt;
Václav Kubernáte7248b22020-06-26 15:38:59 +020089}
90
Václav Kubernát48e9dfa2020-07-08 10:55:12 +020091std::shared_ptr<Schema> ProxyDatastore::schema() const
92{
93 return m_datastore->schema();
94}
Václav Kubernáte7248b22020-06-26 15:38:59 +020095
Václav Kubernát2bed9522020-12-01 03:37:41 +010096std::optional<std::string> ProxyDatastore::inputDatastorePath()
97{
98 return m_inputPath;
99}
100
Václav Kubernáte7248b22020-06-26 15:38:59 +0200101std::shared_ptr<DatastoreAccess> ProxyDatastore::pickDatastore(const std::string& path) const
102{
Václav Kubernát2bed9522020-12-01 03:37:41 +0100103 if (!m_inputDatastore || !boost::starts_with(path, *m_inputPath)) {
Václav Kubernáte7248b22020-06-26 15:38:59 +0200104 return m_datastore;
105 } else {
106 return m_inputDatastore;
107 }
108}