blob: 74f0bb149f71dc8d044efc52b60c37c8f6f37284 [file] [log] [blame]
Junxiao Shi7357ef22016-09-07 02:39:37 +00001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
Junxiao Shi22f85682018-01-22 19:23:22 +00002/*
3 * Copyright (c) 2013-2018 Regents of the University of California.
Junxiao Shi7357ef22016-09-07 02:39:37 +00004 *
5 * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
6 *
7 * ndn-cxx library is free software: you can redistribute it and/or modify it under the
8 * terms of the GNU Lesser General Public License as published by the Free Software
9 * Foundation, either version 3 of the License, or (at your option) any later version.
10 *
11 * ndn-cxx library is distributed in the hope that it will be useful, but WITHOUT ANY
12 * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
13 * PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
14 *
15 * You should have received copies of the GNU General Public License and GNU Lesser
16 * General Public License along with ndn-cxx, e.g., in COPYING.md file. If not, see
17 * <http://www.gnu.org/licenses/>.
18 *
19 * See AUTHORS.md for complete list of ndn-cxx authors and contributors.
20 */
21
22#ifndef NDN_MGMT_NFD_CONTROL_COMMAND_HPP
23#define NDN_MGMT_NFD_CONTROL_COMMAND_HPP
24
25#include "control-parameters.hpp"
26
27namespace ndn {
28namespace nfd {
29
30/**
31 * \ingroup management
32 * \brief base class of NFD ControlCommand
Alexander Afanasyeve6835fe2017-01-19 20:05:01 -080033 * \sa https://redmine.named-data.net/projects/nfd/wiki/ControlCommand
Junxiao Shi7357ef22016-09-07 02:39:37 +000034 */
35class ControlCommand : noncopyable
36{
37public:
38 /** \brief represents an error in ControlParameters
39 */
40 class ArgumentError : public std::invalid_argument
41 {
42 public:
43 explicit
44 ArgumentError(const std::string& what)
45 : std::invalid_argument(what)
46 {
47 }
48 };
49
50 virtual
51 ~ControlCommand();
52
53 /** \brief validate request parameters
54 * \throw ArgumentError if parameters are invalid
55 */
56 virtual void
57 validateRequest(const ControlParameters& parameters) const;
58
59 /** \brief apply default values to missing fields in request
60 */
61 virtual void
62 applyDefaultsToRequest(ControlParameters& parameters) const;
63
64 /** \brief validate response parameters
65 * \throw ArgumentError if parameters are invalid
66 */
67 virtual void
68 validateResponse(const ControlParameters& parameters) const;
69
70 /** \brief apply default values to missing fields in response
71 */
72 virtual void
73 applyDefaultsToResponse(ControlParameters& parameters) const;
74
75 /** \brief construct the Name for a request Interest
76 * \throw ArgumentError if parameters are invalid
77 */
78 Name
79 getRequestName(const Name& commandPrefix, const ControlParameters& parameters) const;
80
81protected:
82 ControlCommand(const std::string& module, const std::string& verb);
83
84 class FieldValidator
85 {
86 public:
87 FieldValidator();
88
89 /** \brief declare a required field
90 */
91 FieldValidator&
92 required(ControlParameterField field)
93 {
94 m_required[field] = true;
95 return *this;
96 }
97
98 /** \brief declare an optional field
99 */
100 FieldValidator&
101 optional(ControlParameterField field)
102 {
103 m_optional[field] = true;
104 return *this;
105 }
106
107 /** \brief verify that all required fields are present,
108 * and all present fields are either required or optional
109 * \throw ArgumentError
110 */
111 void
112 validate(const ControlParameters& parameters) const;
113
114 private:
115 std::vector<bool> m_required;
116 std::vector<bool> m_optional;
117 };
118
119protected:
120 /** \brief FieldValidator for request ControlParameters
121 *
122 * Constructor of subclass should populate this validator.
123 */
124 FieldValidator m_requestValidator;
125 /** \brief FieldValidator for response ControlParameters
126 *
127 * Constructor of subclass should populate this validator.
128 */
129 FieldValidator m_responseValidator;
130
131private:
132 name::Component m_module;
133 name::Component m_verb;
134};
135
136
137/**
138 * \ingroup management
139 * \brief represents a faces/create command
Alexander Afanasyeve6835fe2017-01-19 20:05:01 -0800140 * \sa https://redmine.named-data.net/projects/nfd/wiki/FaceMgmt#Create-a-face
Junxiao Shi7357ef22016-09-07 02:39:37 +0000141 */
142class FaceCreateCommand : public ControlCommand
143{
144public:
145 FaceCreateCommand();
146
Davide Pesavento57c07df2016-12-11 18:41:45 -0500147 void
Junxiao Shi7357ef22016-09-07 02:39:37 +0000148 applyDefaultsToRequest(ControlParameters& parameters) const override;
149
Davide Pesavento57c07df2016-12-11 18:41:45 -0500150 void
Junxiao Shi7357ef22016-09-07 02:39:37 +0000151 validateResponse(const ControlParameters& parameters) const override;
152};
153
154
155/**
156 * \ingroup management
157 * \brief represents a faces/update command
Alexander Afanasyeve6835fe2017-01-19 20:05:01 -0800158 * \sa https://redmine.named-data.net/projects/nfd/wiki/FaceMgmt#Update-a-face
Junxiao Shi7357ef22016-09-07 02:39:37 +0000159 */
160class FaceUpdateCommand : public ControlCommand
161{
162public:
163 FaceUpdateCommand();
164
Davide Pesavento57c07df2016-12-11 18:41:45 -0500165 void
Junxiao Shi7357ef22016-09-07 02:39:37 +0000166 applyDefaultsToRequest(ControlParameters& parameters) const override;
167
Junxiao Shi7357ef22016-09-07 02:39:37 +0000168 /**
169 * \note This can only validate ControlParameters in a success response.
170 * Failure responses should be validated with validateRequest.
171 */
Davide Pesavento57c07df2016-12-11 18:41:45 -0500172 void
Junxiao Shi7357ef22016-09-07 02:39:37 +0000173 validateResponse(const ControlParameters& parameters) const override;
174};
175
176
177/**
178 * \ingroup management
179 * \brief represents a faces/destroy command
Alexander Afanasyeve6835fe2017-01-19 20:05:01 -0800180 * \sa https://redmine.named-data.net/projects/nfd/wiki/FaceMgmt#Destroy-a-face
Junxiao Shi7357ef22016-09-07 02:39:37 +0000181 */
182class FaceDestroyCommand : public ControlCommand
183{
184public:
185 FaceDestroyCommand();
186
Davide Pesavento57c07df2016-12-11 18:41:45 -0500187 void
Junxiao Shi7357ef22016-09-07 02:39:37 +0000188 validateRequest(const ControlParameters& parameters) const override;
189
Davide Pesavento57c07df2016-12-11 18:41:45 -0500190 void
Junxiao Shi7357ef22016-09-07 02:39:37 +0000191 validateResponse(const ControlParameters& parameters) const override;
192};
193
194
195/**
196 * \ingroup management
Junxiao Shi7357ef22016-09-07 02:39:37 +0000197 * \brief represents a fib/add-nexthop command
Alexander Afanasyeve6835fe2017-01-19 20:05:01 -0800198 * \sa https://redmine.named-data.net/projects/nfd/wiki/FibMgmt#Add-a-nexthop
Junxiao Shi7357ef22016-09-07 02:39:37 +0000199 */
200class FibAddNextHopCommand : public ControlCommand
201{
202public:
203 FibAddNextHopCommand();
204
Davide Pesavento57c07df2016-12-11 18:41:45 -0500205 void
Junxiao Shi7357ef22016-09-07 02:39:37 +0000206 applyDefaultsToRequest(ControlParameters& parameters) const override;
207
Davide Pesavento57c07df2016-12-11 18:41:45 -0500208 void
Junxiao Shi7357ef22016-09-07 02:39:37 +0000209 validateResponse(const ControlParameters& parameters) const override;
210};
211
212
213/**
214 * \ingroup management
215 * \brief represents a fib/remove-nexthop command
Alexander Afanasyeve6835fe2017-01-19 20:05:01 -0800216 * \sa https://redmine.named-data.net/projects/nfd/wiki/FibMgmt#Remove-a-nexthop
Junxiao Shi7357ef22016-09-07 02:39:37 +0000217 */
218class FibRemoveNextHopCommand : public ControlCommand
219{
220public:
221 FibRemoveNextHopCommand();
222
Davide Pesavento57c07df2016-12-11 18:41:45 -0500223 void
Junxiao Shi7357ef22016-09-07 02:39:37 +0000224 applyDefaultsToRequest(ControlParameters& parameters) const override;
225
Davide Pesavento57c07df2016-12-11 18:41:45 -0500226 void
Junxiao Shi7357ef22016-09-07 02:39:37 +0000227 validateResponse(const ControlParameters& parameters) const override;
228};
229
230
231/**
232 * \ingroup management
Junxiao Shi22f85682018-01-22 19:23:22 +0000233 * \brief represents a cs/config command
234 * \sa https://redmine.named-data.net/projects/nfd/wiki/CsMgmt#Update-config
235 */
236class CsConfigCommand : public ControlCommand
237{
238public:
239 CsConfigCommand();
240};
241
242
243/**
244 * \ingroup management
Junxiao Shi7357ef22016-09-07 02:39:37 +0000245 * \brief represents a strategy-choice/set command
Alexander Afanasyeve6835fe2017-01-19 20:05:01 -0800246 * \sa https://redmine.named-data.net/projects/nfd/wiki/StrategyChoice#Set-the-strategy-for-a-namespace
Junxiao Shi7357ef22016-09-07 02:39:37 +0000247 */
248class StrategyChoiceSetCommand : public ControlCommand
249{
250public:
251 StrategyChoiceSetCommand();
252};
253
254
255/**
256 * \ingroup management
257 * \brief represents a strategy-choice/set command
Alexander Afanasyeve6835fe2017-01-19 20:05:01 -0800258 * \sa https://redmine.named-data.net/projects/nfd/wiki/StrategyChoice#Unset-the-strategy-for-a-namespace
Junxiao Shi7357ef22016-09-07 02:39:37 +0000259 */
260class StrategyChoiceUnsetCommand : public ControlCommand
261{
262public:
263 StrategyChoiceUnsetCommand();
264
Davide Pesavento57c07df2016-12-11 18:41:45 -0500265 void
Junxiao Shi7357ef22016-09-07 02:39:37 +0000266 validateRequest(const ControlParameters& parameters) const override;
267
Davide Pesavento57c07df2016-12-11 18:41:45 -0500268 void
Junxiao Shi7357ef22016-09-07 02:39:37 +0000269 validateResponse(const ControlParameters& parameters) const override;
270};
271
272
273/**
274 * \ingroup management
275 * \brief represents a rib/register command
Alexander Afanasyeve6835fe2017-01-19 20:05:01 -0800276 * \sa https://redmine.named-data.net/projects/nfd/wiki/RibMgmt#Register-a-route
Junxiao Shi7357ef22016-09-07 02:39:37 +0000277 */
278class RibRegisterCommand : public ControlCommand
279{
280public:
281 RibRegisterCommand();
282
Davide Pesavento57c07df2016-12-11 18:41:45 -0500283 void
Junxiao Shi7357ef22016-09-07 02:39:37 +0000284 applyDefaultsToRequest(ControlParameters& parameters) const override;
285
Davide Pesavento57c07df2016-12-11 18:41:45 -0500286 void
Junxiao Shi7357ef22016-09-07 02:39:37 +0000287 validateResponse(const ControlParameters& parameters) const override;
288};
289
290
291/**
292 * \ingroup management
293 * \brief represents a rib/unregister command
Alexander Afanasyeve6835fe2017-01-19 20:05:01 -0800294 * \sa https://redmine.named-data.net/projects/nfd/wiki/RibMgmt#Unregister-a-route
Junxiao Shi7357ef22016-09-07 02:39:37 +0000295 */
296class RibUnregisterCommand : public ControlCommand
297{
298public:
299 RibUnregisterCommand();
300
Davide Pesavento57c07df2016-12-11 18:41:45 -0500301 void
Junxiao Shi7357ef22016-09-07 02:39:37 +0000302 applyDefaultsToRequest(ControlParameters& parameters) const override;
303
Davide Pesavento57c07df2016-12-11 18:41:45 -0500304 void
Junxiao Shi7357ef22016-09-07 02:39:37 +0000305 validateResponse(const ControlParameters& parameters) const override;
306};
307
308} // namespace nfd
309} // namespace ndn
310
311#endif // NDN_MGMT_NFD_CONTROL_COMMAND_HPP