blob: 169d8378902efb0002fbff3afce49263d3522aff [file] [log] [blame]
Alexander Afanasyevc169a812014-05-20 20:37:29 -04001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
Junxiao Shi5ec80222014-03-25 20:08:05 -07002/**
Yanbiao Licbdacb22016-08-02 16:02:35 +08003 * Copyright (c) 2013-2016 Regents of the University of California.
Alexander Afanasyevdfa52c42014-04-24 21:10:11 -07004 *
5 * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
Alexander Afanasyevdfa52c42014-04-24 21:10:11 -07006 *
Alexander Afanasyevc169a812014-05-20 20:37:29 -04007 * 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.
Junxiao Shi5ec80222014-03-25 20:08:05 -070020 */
21
22#ifndef NDN_MANAGEMENT_NFD_CONTROL_COMMAND_HPP
23#define NDN_MANAGEMENT_NFD_CONTROL_COMMAND_HPP
24
25#include "nfd-control-parameters.hpp"
Junxiao Shi5ec80222014-03-25 20:08:05 -070026
27namespace ndn {
28namespace nfd {
29
Alexander Afanasyev4671bf72014-05-19 09:01:37 -040030/**
31 * \ingroup management
32 * \brief base class of NFD ControlCommand
33 * \sa http://redmine.named-data.net/projects/nfd/wiki/ControlCommand
Junxiao Shi5ec80222014-03-25 20:08:05 -070034 */
Junxiao Shi7b6b79d2014-03-26 20:59:35 -070035class ControlCommand : noncopyable
Junxiao Shi5ec80222014-03-25 20:08:05 -070036{
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
Davide Pesaventoaeeb3fc2016-08-14 03:40:02 +020050 virtual
51 ~ControlCommand();
52
Junxiao Shi5ec80222014-03-25 20:08:05 -070053 /** \brief validate request parameters
Junxiao Shi5de006b2014-10-26 20:20:52 -070054 * \throw ArgumentError if parameters are invalid
Junxiao Shi5ec80222014-03-25 20:08:05 -070055 */
56 virtual void
Junxiao Shi70911652014-08-12 10:14:24 -070057 validateRequest(const ControlParameters& parameters) const;
Junxiao Shi5ec80222014-03-25 20:08:05 -070058
59 /** \brief apply default values to missing fields in request
60 */
61 virtual void
Junxiao Shi70911652014-08-12 10:14:24 -070062 applyDefaultsToRequest(ControlParameters& parameters) const;
Junxiao Shi5ec80222014-03-25 20:08:05 -070063
64 /** \brief validate response parameters
Junxiao Shi5de006b2014-10-26 20:20:52 -070065 * \throw ArgumentError if parameters are invalid
Junxiao Shi5ec80222014-03-25 20:08:05 -070066 */
67 virtual void
Junxiao Shi70911652014-08-12 10:14:24 -070068 validateResponse(const ControlParameters& parameters) const;
Junxiao Shi5ec80222014-03-25 20:08:05 -070069
70 /** \brief apply default values to missing fields in response
71 */
72 virtual void
Junxiao Shi70911652014-08-12 10:14:24 -070073 applyDefaultsToResponse(ControlParameters& parameters) const;
74
75 /** \brief construct the Name for a request Interest
Junxiao Shi5de006b2014-10-26 20:20:52 -070076 * \throw ArgumentError if parameters are invalid
77 */
78 Name
79 getRequestName(const Name& commandPrefix, const ControlParameters& parameters) const;
80
Junxiao Shi5ec80222014-03-25 20:08:05 -070081protected:
Junxiao Shi70911652014-08-12 10:14:24 -070082 ControlCommand(const std::string& module, const std::string& verb);
Junxiao Shi5ec80222014-03-25 20:08:05 -070083
84 class FieldValidator
85 {
86 public:
Junxiao Shi70911652014-08-12 10:14:24 -070087 FieldValidator();
Junxiao Shi5ec80222014-03-25 20:08:05 -070088
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
Junxiao Shi70911652014-08-12 10:14:24 -0700112 validate(const ControlParameters& parameters) const;
Junxiao Shi5ec80222014-03-25 20:08:05 -0700113
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:
Junxiao Shi5de006b2014-10-26 20:20:52 -0700132 name::Component m_module;
133 name::Component m_verb;
Junxiao Shi5ec80222014-03-25 20:08:05 -0700134};
135
136
Alexander Afanasyev4671bf72014-05-19 09:01:37 -0400137/**
138 * \ingroup management
139 * \brief represents a faces/create command
140 * \sa http://redmine.named-data.net/projects/nfd/wiki/FaceMgmt#Create-a-face
Junxiao Shi5ec80222014-03-25 20:08:05 -0700141 */
142class FaceCreateCommand : public ControlCommand
143{
144public:
Junxiao Shi70911652014-08-12 10:14:24 -0700145 FaceCreateCommand();
Junxiao Shi5ec80222014-03-25 20:08:05 -0700146
147 virtual void
Davide Pesaventoaeeb3fc2016-08-14 03:40:02 +0200148 applyDefaultsToRequest(ControlParameters& parameters) const override;
Yukai Tud93c5fc2015-08-25 11:37:16 +0800149
150 virtual void
Eric Newberryda916d62016-08-11 23:04:34 -0700151 validateRequest(const ControlParameters& parameters) const override;
152
153 virtual void
Davide Pesaventoaeeb3fc2016-08-14 03:40:02 +0200154 validateResponse(const ControlParameters& parameters) const override;
Junxiao Shi5ec80222014-03-25 20:08:05 -0700155};
156
Davide Pesaventoaeeb3fc2016-08-14 03:40:02 +0200157
Yanbiao Licbdacb22016-08-02 16:02:35 +0800158/**
159 * \ingroup management
160 * \brief represents a faces/update command
161 * \sa http://redmine.named-data.net/projects/nfd/wiki/FaceMgmt#Update-a-face
162 */
163class FaceUpdateCommand : public ControlCommand
164{
165public:
166 FaceUpdateCommand();
167
168 virtual void
Eric Newberryda916d62016-08-11 23:04:34 -0700169 applyDefaultsToRequest(ControlParameters& parameters) const override;
170
171 virtual void
Davide Pesaventoaeeb3fc2016-08-14 03:40:02 +0200172 validateRequest(const ControlParameters& parameters) const override;
Yanbiao Licbdacb22016-08-02 16:02:35 +0800173
Eric Newberry138ef2c2016-08-15 20:29:03 -0700174 /**
175 * \note This can only validate ControlParameters in a success response.
176 * Failure responses should be validated with validateRequest.
177 */
Yanbiao Licbdacb22016-08-02 16:02:35 +0800178 virtual void
Davide Pesaventoaeeb3fc2016-08-14 03:40:02 +0200179 validateResponse(const ControlParameters& parameters) const override;
Yanbiao Licbdacb22016-08-02 16:02:35 +0800180};
Junxiao Shi5ec80222014-03-25 20:08:05 -0700181
Davide Pesaventoaeeb3fc2016-08-14 03:40:02 +0200182
Alexander Afanasyev4671bf72014-05-19 09:01:37 -0400183/**
184 * \ingroup management
185 * \brief represents a faces/destroy command
186 * \sa http://redmine.named-data.net/projects/nfd/wiki/FaceMgmt#Destroy-a-face
Junxiao Shi5ec80222014-03-25 20:08:05 -0700187 */
188class FaceDestroyCommand : public ControlCommand
189{
190public:
Junxiao Shi70911652014-08-12 10:14:24 -0700191 FaceDestroyCommand();
Junxiao Shi5ec80222014-03-25 20:08:05 -0700192
193 virtual void
Davide Pesaventoaeeb3fc2016-08-14 03:40:02 +0200194 validateRequest(const ControlParameters& parameters) const override;
Junxiao Shi5ec80222014-03-25 20:08:05 -0700195
196 virtual void
Davide Pesaventoaeeb3fc2016-08-14 03:40:02 +0200197 validateResponse(const ControlParameters& parameters) const override;
Junxiao Shi5ec80222014-03-25 20:08:05 -0700198};
199
Davide Pesaventoaeeb3fc2016-08-14 03:40:02 +0200200
Alexander Afanasyev4671bf72014-05-19 09:01:37 -0400201/**
202 * \ingroup management
203 * \brief Base class for faces/[*]-local-control commands
204 */
Junxiao Shi5ec80222014-03-25 20:08:05 -0700205class FaceLocalControlCommand : public ControlCommand
206{
Junxiao Shi6888bc12014-03-29 23:01:41 -0700207public:
208 virtual void
Davide Pesaventoaeeb3fc2016-08-14 03:40:02 +0200209 validateRequest(const ControlParameters& parameters) const override;
Junxiao Shi6888bc12014-03-29 23:01:41 -0700210
211 virtual void
Davide Pesaventoaeeb3fc2016-08-14 03:40:02 +0200212 validateResponse(const ControlParameters& parameters) const override;
Junxiao Shi6888bc12014-03-29 23:01:41 -0700213
Junxiao Shi5ec80222014-03-25 20:08:05 -0700214protected:
215 explicit
Junxiao Shi70911652014-08-12 10:14:24 -0700216 FaceLocalControlCommand(const std::string& verb);
Junxiao Shi5ec80222014-03-25 20:08:05 -0700217};
218
219
Alexander Afanasyev4671bf72014-05-19 09:01:37 -0400220/**
221 * \ingroup management
222 * \brief represents a faces/enable-local-control command
223 * \sa http://redmine.named-data.net/projects/nfd/wiki/FaceMgmt#Enable-a-LocalControlHeader-feature
Junxiao Shi5ec80222014-03-25 20:08:05 -0700224 */
225class FaceEnableLocalControlCommand : public FaceLocalControlCommand
226{
227public:
Junxiao Shi70911652014-08-12 10:14:24 -0700228 FaceEnableLocalControlCommand();
Junxiao Shi5ec80222014-03-25 20:08:05 -0700229};
230
231
Alexander Afanasyev4671bf72014-05-19 09:01:37 -0400232/**
233 * \ingroup management
234 * \brief represents a faces/disable-local-control command
235 * \sa http://redmine.named-data.net/projects/nfd/wiki/FaceMgmt#Disable-a-LocalControlHeader-feature
Junxiao Shi5ec80222014-03-25 20:08:05 -0700236 */
237class FaceDisableLocalControlCommand : public FaceLocalControlCommand
238{
239public:
Junxiao Shi70911652014-08-12 10:14:24 -0700240 FaceDisableLocalControlCommand();
Junxiao Shi5ec80222014-03-25 20:08:05 -0700241};
242
243
Alexander Afanasyev4671bf72014-05-19 09:01:37 -0400244/**
245 * \ingroup management
246 * \brief represents a fib/add-nexthop command
247 * \sa http://redmine.named-data.net/projects/nfd/wiki/FibMgmt#Add-a-nexthop
Junxiao Shi5ec80222014-03-25 20:08:05 -0700248 */
249class FibAddNextHopCommand : public ControlCommand
250{
251public:
Junxiao Shi70911652014-08-12 10:14:24 -0700252 FibAddNextHopCommand();
Junxiao Shi5ec80222014-03-25 20:08:05 -0700253
254 virtual void
Davide Pesaventoaeeb3fc2016-08-14 03:40:02 +0200255 applyDefaultsToRequest(ControlParameters& parameters) const override;
Junxiao Shi5ec80222014-03-25 20:08:05 -0700256
257 virtual void
Davide Pesaventoaeeb3fc2016-08-14 03:40:02 +0200258 validateResponse(const ControlParameters& parameters) const override;
Junxiao Shi5ec80222014-03-25 20:08:05 -0700259};
260
261
Alexander Afanasyev4671bf72014-05-19 09:01:37 -0400262/**
263 * \ingroup management
264 * \brief represents a fib/remove-nexthop command
265 * \sa http://redmine.named-data.net/projects/nfd/wiki/FibMgmt#Remove-a-nexthop
Junxiao Shi5ec80222014-03-25 20:08:05 -0700266 */
267class FibRemoveNextHopCommand : public ControlCommand
268{
269public:
Junxiao Shi70911652014-08-12 10:14:24 -0700270 FibRemoveNextHopCommand();
Junxiao Shi5ec80222014-03-25 20:08:05 -0700271
272 virtual void
Davide Pesaventoaeeb3fc2016-08-14 03:40:02 +0200273 applyDefaultsToRequest(ControlParameters& parameters) const override;
Junxiao Shicaac54e2014-05-20 15:27:01 -0700274
275 virtual void
Davide Pesaventoaeeb3fc2016-08-14 03:40:02 +0200276 validateResponse(const ControlParameters& parameters) const override;
Junxiao Shi5ec80222014-03-25 20:08:05 -0700277};
278
279
Alexander Afanasyev4671bf72014-05-19 09:01:37 -0400280/**
281 * \ingroup management
282 * \brief represents a strategy-choice/set command
283 * \sa http://redmine.named-data.net/projects/nfd/wiki/StrategyChoice#Set-the-strategy-for-a-namespace
Junxiao Shi5ec80222014-03-25 20:08:05 -0700284 */
285class StrategyChoiceSetCommand : public ControlCommand
286{
287public:
Junxiao Shi70911652014-08-12 10:14:24 -0700288 StrategyChoiceSetCommand();
Junxiao Shi5ec80222014-03-25 20:08:05 -0700289};
290
291
Alexander Afanasyev4671bf72014-05-19 09:01:37 -0400292/**
293 * \ingroup management
294 * \brief represents a strategy-choice/set command
295 * \sa http://redmine.named-data.net/projects/nfd/wiki/StrategyChoice#Unset-the-strategy-for-a-namespace
Junxiao Shi5ec80222014-03-25 20:08:05 -0700296 */
297class StrategyChoiceUnsetCommand : public ControlCommand
298{
299public:
Junxiao Shi70911652014-08-12 10:14:24 -0700300 StrategyChoiceUnsetCommand();
Junxiao Shi5ec80222014-03-25 20:08:05 -0700301
302 virtual void
Davide Pesaventoaeeb3fc2016-08-14 03:40:02 +0200303 validateRequest(const ControlParameters& parameters) const override;
Junxiao Shi5ec80222014-03-25 20:08:05 -0700304
305 virtual void
Davide Pesaventoaeeb3fc2016-08-14 03:40:02 +0200306 validateResponse(const ControlParameters& parameters) const override;
Junxiao Shi5ec80222014-03-25 20:08:05 -0700307};
308
Junxiao Shi5f6c74f2014-04-18 16:29:44 -0700309
Alexander Afanasyev4671bf72014-05-19 09:01:37 -0400310/**
311 * \ingroup management
Alexander Afanasyev4671bf72014-05-19 09:01:37 -0400312 * \brief represents a rib/register command
313 * \sa http://redmine.named-data.net/projects/nfd/wiki/RibMgmt#Register-a-route
Junxiao Shi5f6c74f2014-04-18 16:29:44 -0700314 */
315class RibRegisterCommand : public ControlCommand
316{
317public:
Junxiao Shi70911652014-08-12 10:14:24 -0700318 RibRegisterCommand();
Junxiao Shi5f6c74f2014-04-18 16:29:44 -0700319
320 virtual void
Davide Pesaventoaeeb3fc2016-08-14 03:40:02 +0200321 applyDefaultsToRequest(ControlParameters& parameters) const override;
Junxiao Shi5f6c74f2014-04-18 16:29:44 -0700322
323 virtual void
Davide Pesaventoaeeb3fc2016-08-14 03:40:02 +0200324 validateResponse(const ControlParameters& parameters) const override;
Junxiao Shi5f6c74f2014-04-18 16:29:44 -0700325};
326
327
Alexander Afanasyev4671bf72014-05-19 09:01:37 -0400328/**
329 * \ingroup management
330 * \brief represents a rib/unregister command
331 * \sa http://redmine.named-data.net/projects/nfd/wiki/RibMgmt#Unregister-a-route
Junxiao Shi5f6c74f2014-04-18 16:29:44 -0700332 */
333class RibUnregisterCommand : public ControlCommand
334{
335public:
Junxiao Shi70911652014-08-12 10:14:24 -0700336 RibUnregisterCommand();
Junxiao Shi5f6c74f2014-04-18 16:29:44 -0700337
338 virtual void
Davide Pesaventoaeeb3fc2016-08-14 03:40:02 +0200339 applyDefaultsToRequest(ControlParameters& parameters) const override;
Junxiao Shi5f6c74f2014-04-18 16:29:44 -0700340
341 virtual void
Davide Pesaventoaeeb3fc2016-08-14 03:40:02 +0200342 validateResponse(const ControlParameters& parameters) const override;
Junxiao Shi5f6c74f2014-04-18 16:29:44 -0700343};
344
Junxiao Shi5ec80222014-03-25 20:08:05 -0700345} // namespace nfd
346} // namespace ndn
347
348#endif // NDN_MANAGEMENT_NFD_CONTROL_COMMAND_HPP