blob: a7b8bc6786d14595f2d2529820a2b3fb8db442e1 [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/**
Alexander Afanasyevc169a812014-05-20 20:37:29 -04003 * Copyright (c) 2013-2014 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
Junxiao Shi5ec80222014-03-25 20:08:05 -070050 /** \brief validate request parameters
Junxiao Shi5de006b2014-10-26 20:20:52 -070051 * \throw ArgumentError if parameters are invalid
Junxiao Shi5ec80222014-03-25 20:08:05 -070052 */
53 virtual void
Junxiao Shi70911652014-08-12 10:14:24 -070054 validateRequest(const ControlParameters& parameters) const;
Junxiao Shi5ec80222014-03-25 20:08:05 -070055
56 /** \brief apply default values to missing fields in request
57 */
58 virtual void
Junxiao Shi70911652014-08-12 10:14:24 -070059 applyDefaultsToRequest(ControlParameters& parameters) const;
Junxiao Shi5ec80222014-03-25 20:08:05 -070060
61 /** \brief validate response parameters
Junxiao Shi5de006b2014-10-26 20:20:52 -070062 * \throw ArgumentError if parameters are invalid
Junxiao Shi5ec80222014-03-25 20:08:05 -070063 */
64 virtual void
Junxiao Shi70911652014-08-12 10:14:24 -070065 validateResponse(const ControlParameters& parameters) const;
Junxiao Shi5ec80222014-03-25 20:08:05 -070066
67 /** \brief apply default values to missing fields in response
68 */
69 virtual void
Junxiao Shi70911652014-08-12 10:14:24 -070070 applyDefaultsToResponse(ControlParameters& parameters) const;
71
72 /** \brief construct the Name for a request Interest
Junxiao Shi5de006b2014-10-26 20:20:52 -070073 * \throw ArgumentError if parameters are invalid
74 */
75 Name
76 getRequestName(const Name& commandPrefix, const ControlParameters& parameters) const;
77
Junxiao Shi5ec80222014-03-25 20:08:05 -070078protected:
Junxiao Shi70911652014-08-12 10:14:24 -070079 ControlCommand(const std::string& module, const std::string& verb);
Junxiao Shi5ec80222014-03-25 20:08:05 -070080
81 class FieldValidator
82 {
83 public:
Junxiao Shi70911652014-08-12 10:14:24 -070084 FieldValidator();
Junxiao Shi5ec80222014-03-25 20:08:05 -070085
86 /** \brief declare a required field
87 */
88 FieldValidator&
89 required(ControlParameterField field)
90 {
91 m_required[field] = true;
92 return *this;
93 }
94
95 /** \brief declare an optional field
96 */
97 FieldValidator&
98 optional(ControlParameterField field)
99 {
100 m_optional[field] = true;
101 return *this;
102 }
103
104 /** \brief verify that all required fields are present,
105 * and all present fields are either required or optional
106 * \throw ArgumentError
107 */
108 void
Junxiao Shi70911652014-08-12 10:14:24 -0700109 validate(const ControlParameters& parameters) const;
Junxiao Shi5ec80222014-03-25 20:08:05 -0700110
111 private:
112 std::vector<bool> m_required;
113 std::vector<bool> m_optional;
114 };
115
116protected:
117 /** \brief FieldValidator for request ControlParameters
118 *
119 * Constructor of subclass should populate this validator.
120 */
121 FieldValidator m_requestValidator;
122 /** \brief FieldValidator for response ControlParameters
123 *
124 * Constructor of subclass should populate this validator.
125 */
126 FieldValidator m_responseValidator;
127
128private:
Junxiao Shi5de006b2014-10-26 20:20:52 -0700129 name::Component m_module;
130 name::Component m_verb;
Junxiao Shi5ec80222014-03-25 20:08:05 -0700131};
132
133
Alexander Afanasyev4671bf72014-05-19 09:01:37 -0400134/**
135 * \ingroup management
136 * \brief represents a faces/create command
137 * \sa http://redmine.named-data.net/projects/nfd/wiki/FaceMgmt#Create-a-face
Junxiao Shi5ec80222014-03-25 20:08:05 -0700138 */
139class FaceCreateCommand : public ControlCommand
140{
141public:
Junxiao Shi70911652014-08-12 10:14:24 -0700142 FaceCreateCommand();
Junxiao Shi5ec80222014-03-25 20:08:05 -0700143
144 virtual void
Junxiao Shi70911652014-08-12 10:14:24 -0700145 validateResponse(const ControlParameters& parameters) const;
Junxiao Shi5ec80222014-03-25 20:08:05 -0700146};
147
148
Alexander Afanasyev4671bf72014-05-19 09:01:37 -0400149/**
150 * \ingroup management
151 * \brief represents a faces/destroy command
152 * \sa http://redmine.named-data.net/projects/nfd/wiki/FaceMgmt#Destroy-a-face
Junxiao Shi5ec80222014-03-25 20:08:05 -0700153 */
154class FaceDestroyCommand : public ControlCommand
155{
156public:
Junxiao Shi70911652014-08-12 10:14:24 -0700157 FaceDestroyCommand();
Junxiao Shi5ec80222014-03-25 20:08:05 -0700158
159 virtual void
Junxiao Shi70911652014-08-12 10:14:24 -0700160 validateRequest(const ControlParameters& parameters) const;
Junxiao Shi5ec80222014-03-25 20:08:05 -0700161
162 virtual void
Junxiao Shi70911652014-08-12 10:14:24 -0700163 validateResponse(const ControlParameters& parameters) const;
Junxiao Shi5ec80222014-03-25 20:08:05 -0700164};
165
Alexander Afanasyev4671bf72014-05-19 09:01:37 -0400166/**
167 * \ingroup management
168 * \brief Base class for faces/[*]-local-control commands
169 */
Junxiao Shi5ec80222014-03-25 20:08:05 -0700170class FaceLocalControlCommand : public ControlCommand
171{
Junxiao Shi6888bc12014-03-29 23:01:41 -0700172public:
173 virtual void
Junxiao Shi70911652014-08-12 10:14:24 -0700174 validateRequest(const ControlParameters& parameters) const;
Junxiao Shi6888bc12014-03-29 23:01:41 -0700175
176 virtual void
Junxiao Shi70911652014-08-12 10:14:24 -0700177 validateResponse(const ControlParameters& parameters) const;
Junxiao Shi6888bc12014-03-29 23:01:41 -0700178
Junxiao Shi5ec80222014-03-25 20:08:05 -0700179protected:
180 explicit
Junxiao Shi70911652014-08-12 10:14:24 -0700181 FaceLocalControlCommand(const std::string& verb);
Junxiao Shi5ec80222014-03-25 20:08:05 -0700182};
183
184
Alexander Afanasyev4671bf72014-05-19 09:01:37 -0400185/**
186 * \ingroup management
187 * \brief represents a faces/enable-local-control command
188 * \sa http://redmine.named-data.net/projects/nfd/wiki/FaceMgmt#Enable-a-LocalControlHeader-feature
Junxiao Shi5ec80222014-03-25 20:08:05 -0700189 */
190class FaceEnableLocalControlCommand : public FaceLocalControlCommand
191{
192public:
Junxiao Shi70911652014-08-12 10:14:24 -0700193 FaceEnableLocalControlCommand();
Junxiao Shi5ec80222014-03-25 20:08:05 -0700194};
195
196
Alexander Afanasyev4671bf72014-05-19 09:01:37 -0400197/**
198 * \ingroup management
199 * \brief represents a faces/disable-local-control command
200 * \sa http://redmine.named-data.net/projects/nfd/wiki/FaceMgmt#Disable-a-LocalControlHeader-feature
Junxiao Shi5ec80222014-03-25 20:08:05 -0700201 */
202class FaceDisableLocalControlCommand : public FaceLocalControlCommand
203{
204public:
Junxiao Shi70911652014-08-12 10:14:24 -0700205 FaceDisableLocalControlCommand();
Junxiao Shi5ec80222014-03-25 20:08:05 -0700206};
207
208
Alexander Afanasyev4671bf72014-05-19 09:01:37 -0400209/**
210 * \ingroup management
211 * \brief represents a fib/add-nexthop command
212 * \sa http://redmine.named-data.net/projects/nfd/wiki/FibMgmt#Add-a-nexthop
Junxiao Shi5ec80222014-03-25 20:08:05 -0700213 */
214class FibAddNextHopCommand : public ControlCommand
215{
216public:
Junxiao Shi70911652014-08-12 10:14:24 -0700217 FibAddNextHopCommand();
Junxiao Shi5ec80222014-03-25 20:08:05 -0700218
219 virtual void
Junxiao Shi70911652014-08-12 10:14:24 -0700220 applyDefaultsToRequest(ControlParameters& parameters) const;
Junxiao Shi5ec80222014-03-25 20:08:05 -0700221
222 virtual void
Junxiao Shi70911652014-08-12 10:14:24 -0700223 validateResponse(const ControlParameters& parameters) const;
Junxiao Shi5ec80222014-03-25 20:08:05 -0700224};
225
226
Alexander Afanasyev4671bf72014-05-19 09:01:37 -0400227/**
228 * \ingroup management
229 * \brief represents a fib/remove-nexthop command
230 * \sa http://redmine.named-data.net/projects/nfd/wiki/FibMgmt#Remove-a-nexthop
Junxiao Shi5ec80222014-03-25 20:08:05 -0700231 */
232class FibRemoveNextHopCommand : public ControlCommand
233{
234public:
Junxiao Shi70911652014-08-12 10:14:24 -0700235 FibRemoveNextHopCommand();
Junxiao Shi5ec80222014-03-25 20:08:05 -0700236
237 virtual void
Junxiao Shi70911652014-08-12 10:14:24 -0700238 applyDefaultsToRequest(ControlParameters& parameters) const;
Junxiao Shicaac54e2014-05-20 15:27:01 -0700239
240 virtual void
Junxiao Shi70911652014-08-12 10:14:24 -0700241 validateResponse(const ControlParameters& parameters) const;
Junxiao Shi5ec80222014-03-25 20:08:05 -0700242};
243
244
Alexander Afanasyev4671bf72014-05-19 09:01:37 -0400245/**
246 * \ingroup management
247 * \brief represents a strategy-choice/set command
248 * \sa http://redmine.named-data.net/projects/nfd/wiki/StrategyChoice#Set-the-strategy-for-a-namespace
Junxiao Shi5ec80222014-03-25 20:08:05 -0700249 */
250class StrategyChoiceSetCommand : public ControlCommand
251{
252public:
Junxiao Shi70911652014-08-12 10:14:24 -0700253 StrategyChoiceSetCommand();
Junxiao Shi5ec80222014-03-25 20:08:05 -0700254};
255
256
Alexander Afanasyev4671bf72014-05-19 09:01:37 -0400257/**
258 * \ingroup management
259 * \brief represents a strategy-choice/set command
260 * \sa http://redmine.named-data.net/projects/nfd/wiki/StrategyChoice#Unset-the-strategy-for-a-namespace
Junxiao Shi5ec80222014-03-25 20:08:05 -0700261 */
262class StrategyChoiceUnsetCommand : public ControlCommand
263{
264public:
Junxiao Shi70911652014-08-12 10:14:24 -0700265 StrategyChoiceUnsetCommand();
Junxiao Shi5ec80222014-03-25 20:08:05 -0700266
267 virtual void
Junxiao Shi70911652014-08-12 10:14:24 -0700268 validateRequest(const ControlParameters& parameters) const;
Junxiao Shi5ec80222014-03-25 20:08:05 -0700269
270 virtual void
Junxiao Shi70911652014-08-12 10:14:24 -0700271 validateResponse(const ControlParameters& parameters) const;
Junxiao Shi5ec80222014-03-25 20:08:05 -0700272};
273
Junxiao Shi5f6c74f2014-04-18 16:29:44 -0700274
Alexander Afanasyev4671bf72014-05-19 09:01:37 -0400275/**
276 * \ingroup management
Alexander Afanasyev4671bf72014-05-19 09:01:37 -0400277 * \brief represents a rib/register command
278 * \sa http://redmine.named-data.net/projects/nfd/wiki/RibMgmt#Register-a-route
Junxiao Shi5f6c74f2014-04-18 16:29:44 -0700279 */
280class RibRegisterCommand : public ControlCommand
281{
282public:
Junxiao Shi70911652014-08-12 10:14:24 -0700283 RibRegisterCommand();
Junxiao Shi5f6c74f2014-04-18 16:29:44 -0700284
285 virtual void
Junxiao Shi70911652014-08-12 10:14:24 -0700286 applyDefaultsToRequest(ControlParameters& parameters) const;
Junxiao Shi5f6c74f2014-04-18 16:29:44 -0700287
288 virtual void
Junxiao Shi70911652014-08-12 10:14:24 -0700289 validateResponse(const ControlParameters& parameters) const;
Junxiao Shi5f6c74f2014-04-18 16:29:44 -0700290};
291
292
Alexander Afanasyev4671bf72014-05-19 09:01:37 -0400293/**
294 * \ingroup management
295 * \brief represents a rib/unregister command
296 * \sa http://redmine.named-data.net/projects/nfd/wiki/RibMgmt#Unregister-a-route
Junxiao Shi5f6c74f2014-04-18 16:29:44 -0700297 */
298class RibUnregisterCommand : public ControlCommand
299{
300public:
Junxiao Shi70911652014-08-12 10:14:24 -0700301 RibUnregisterCommand();
Junxiao Shi5f6c74f2014-04-18 16:29:44 -0700302
303 virtual void
Junxiao Shi70911652014-08-12 10:14:24 -0700304 applyDefaultsToRequest(ControlParameters& parameters) const;
Junxiao Shi5f6c74f2014-04-18 16:29:44 -0700305
306 virtual void
Junxiao Shi70911652014-08-12 10:14:24 -0700307 validateResponse(const ControlParameters& parameters) const;
Junxiao Shi5f6c74f2014-04-18 16:29:44 -0700308};
309
310
Junxiao Shi5ec80222014-03-25 20:08:05 -0700311} // namespace nfd
312} // namespace ndn
313
314#endif // NDN_MANAGEMENT_NFD_CONTROL_COMMAND_HPP