blob: e22648693d94631495ad2ad259e335b9d2e7fd40 [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
78public: // deprecated
79 /** \return Name prefix of this ControlCommand
80 * \deprecated use getRequestName
81 */
82 const Name&
83 getPrefix() const;
84
85 /** \brief construct the Name for a request Interest
86 * \throw ArgumentError if parameters are invalid
87 * \deprecated use the two-argument overload
Junxiao Shi70911652014-08-12 10:14:24 -070088 */
89 Name
90 getRequestName(const ControlParameters& parameters) const;
91
Junxiao Shi5ec80222014-03-25 20:08:05 -070092protected:
Junxiao Shi70911652014-08-12 10:14:24 -070093 ControlCommand(const std::string& module, const std::string& verb);
Junxiao Shi5ec80222014-03-25 20:08:05 -070094
95 class FieldValidator
96 {
97 public:
Junxiao Shi70911652014-08-12 10:14:24 -070098 FieldValidator();
Junxiao Shi5ec80222014-03-25 20:08:05 -070099
100 /** \brief declare a required field
101 */
102 FieldValidator&
103 required(ControlParameterField field)
104 {
105 m_required[field] = true;
106 return *this;
107 }
108
109 /** \brief declare an optional field
110 */
111 FieldValidator&
112 optional(ControlParameterField field)
113 {
114 m_optional[field] = true;
115 return *this;
116 }
117
118 /** \brief verify that all required fields are present,
119 * and all present fields are either required or optional
120 * \throw ArgumentError
121 */
122 void
Junxiao Shi70911652014-08-12 10:14:24 -0700123 validate(const ControlParameters& parameters) const;
Junxiao Shi5ec80222014-03-25 20:08:05 -0700124
125 private:
126 std::vector<bool> m_required;
127 std::vector<bool> m_optional;
128 };
129
130protected:
131 /** \brief FieldValidator for request ControlParameters
132 *
133 * Constructor of subclass should populate this validator.
134 */
135 FieldValidator m_requestValidator;
136 /** \brief FieldValidator for response ControlParameters
137 *
138 * Constructor of subclass should populate this validator.
139 */
140 FieldValidator m_responseValidator;
141
142private:
Junxiao Shi5de006b2014-10-26 20:20:52 -0700143 name::Component m_module;
144 name::Component m_verb;
145
146 /** \deprecated kept to support getPrefix
147 */
148 mutable Name m_prefix;
Junxiao Shi5ec80222014-03-25 20:08:05 -0700149};
150
151
Alexander Afanasyev4671bf72014-05-19 09:01:37 -0400152/**
153 * \ingroup management
154 * \brief represents a faces/create command
155 * \sa http://redmine.named-data.net/projects/nfd/wiki/FaceMgmt#Create-a-face
Junxiao Shi5ec80222014-03-25 20:08:05 -0700156 */
157class FaceCreateCommand : public ControlCommand
158{
159public:
Junxiao Shi70911652014-08-12 10:14:24 -0700160 FaceCreateCommand();
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
166
Alexander Afanasyev4671bf72014-05-19 09:01:37 -0400167/**
168 * \ingroup management
169 * \brief represents a faces/destroy command
170 * \sa http://redmine.named-data.net/projects/nfd/wiki/FaceMgmt#Destroy-a-face
Junxiao Shi5ec80222014-03-25 20:08:05 -0700171 */
172class FaceDestroyCommand : public ControlCommand
173{
174public:
Junxiao Shi70911652014-08-12 10:14:24 -0700175 FaceDestroyCommand();
Junxiao Shi5ec80222014-03-25 20:08:05 -0700176
177 virtual void
Junxiao Shi70911652014-08-12 10:14:24 -0700178 validateRequest(const ControlParameters& parameters) const;
Junxiao Shi5ec80222014-03-25 20:08:05 -0700179
180 virtual void
Junxiao Shi70911652014-08-12 10:14:24 -0700181 validateResponse(const ControlParameters& parameters) const;
Junxiao Shi5ec80222014-03-25 20:08:05 -0700182};
183
Alexander Afanasyev4671bf72014-05-19 09:01:37 -0400184/**
185 * \ingroup management
186 * \brief Base class for faces/[*]-local-control commands
187 */
Junxiao Shi5ec80222014-03-25 20:08:05 -0700188class FaceLocalControlCommand : public ControlCommand
189{
Junxiao Shi6888bc12014-03-29 23:01:41 -0700190public:
191 virtual void
Junxiao Shi70911652014-08-12 10:14:24 -0700192 validateRequest(const ControlParameters& parameters) const;
Junxiao Shi6888bc12014-03-29 23:01:41 -0700193
194 virtual void
Junxiao Shi70911652014-08-12 10:14:24 -0700195 validateResponse(const ControlParameters& parameters) const;
Junxiao Shi6888bc12014-03-29 23:01:41 -0700196
Junxiao Shi5ec80222014-03-25 20:08:05 -0700197protected:
198 explicit
Junxiao Shi70911652014-08-12 10:14:24 -0700199 FaceLocalControlCommand(const std::string& verb);
Junxiao Shi5ec80222014-03-25 20:08:05 -0700200};
201
202
Alexander Afanasyev4671bf72014-05-19 09:01:37 -0400203/**
204 * \ingroup management
205 * \brief represents a faces/enable-local-control command
206 * \sa http://redmine.named-data.net/projects/nfd/wiki/FaceMgmt#Enable-a-LocalControlHeader-feature
Junxiao Shi5ec80222014-03-25 20:08:05 -0700207 */
208class FaceEnableLocalControlCommand : public FaceLocalControlCommand
209{
210public:
Junxiao Shi70911652014-08-12 10:14:24 -0700211 FaceEnableLocalControlCommand();
Junxiao Shi5ec80222014-03-25 20:08:05 -0700212};
213
214
Alexander Afanasyev4671bf72014-05-19 09:01:37 -0400215/**
216 * \ingroup management
217 * \brief represents a faces/disable-local-control command
218 * \sa http://redmine.named-data.net/projects/nfd/wiki/FaceMgmt#Disable-a-LocalControlHeader-feature
Junxiao Shi5ec80222014-03-25 20:08:05 -0700219 */
220class FaceDisableLocalControlCommand : public FaceLocalControlCommand
221{
222public:
Junxiao Shi70911652014-08-12 10:14:24 -0700223 FaceDisableLocalControlCommand();
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/add-nexthop command
230 * \sa http://redmine.named-data.net/projects/nfd/wiki/FibMgmt#Add-a-nexthop
Junxiao Shi5ec80222014-03-25 20:08:05 -0700231 */
232class FibAddNextHopCommand : public ControlCommand
233{
234public:
Junxiao Shi70911652014-08-12 10:14:24 -0700235 FibAddNextHopCommand();
Junxiao Shi5ec80222014-03-25 20:08:05 -0700236
237 virtual void
Junxiao Shi70911652014-08-12 10:14:24 -0700238 applyDefaultsToRequest(ControlParameters& parameters) const;
Junxiao Shi5ec80222014-03-25 20:08:05 -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 fib/remove-nexthop command
248 * \sa http://redmine.named-data.net/projects/nfd/wiki/FibMgmt#Remove-a-nexthop
Junxiao Shi5ec80222014-03-25 20:08:05 -0700249 */
250class FibRemoveNextHopCommand : public ControlCommand
251{
252public:
Junxiao Shi70911652014-08-12 10:14:24 -0700253 FibRemoveNextHopCommand();
Junxiao Shi5ec80222014-03-25 20:08:05 -0700254
255 virtual void
Junxiao Shi70911652014-08-12 10:14:24 -0700256 applyDefaultsToRequest(ControlParameters& parameters) const;
Junxiao Shicaac54e2014-05-20 15:27:01 -0700257
258 virtual void
Junxiao Shi70911652014-08-12 10:14:24 -0700259 validateResponse(const ControlParameters& parameters) const;
Junxiao Shi5ec80222014-03-25 20:08:05 -0700260};
261
262
Alexander Afanasyev4671bf72014-05-19 09:01:37 -0400263/**
264 * \ingroup management
265 * \brief represents a strategy-choice/set command
266 * \sa http://redmine.named-data.net/projects/nfd/wiki/StrategyChoice#Set-the-strategy-for-a-namespace
Junxiao Shi5ec80222014-03-25 20:08:05 -0700267 */
268class StrategyChoiceSetCommand : public ControlCommand
269{
270public:
Junxiao Shi70911652014-08-12 10:14:24 -0700271 StrategyChoiceSetCommand();
Junxiao Shi5ec80222014-03-25 20:08:05 -0700272};
273
274
Alexander Afanasyev4671bf72014-05-19 09:01:37 -0400275/**
276 * \ingroup management
277 * \brief represents a strategy-choice/set command
278 * \sa http://redmine.named-data.net/projects/nfd/wiki/StrategyChoice#Unset-the-strategy-for-a-namespace
Junxiao Shi5ec80222014-03-25 20:08:05 -0700279 */
280class StrategyChoiceUnsetCommand : public ControlCommand
281{
282public:
Junxiao Shi70911652014-08-12 10:14:24 -0700283 StrategyChoiceUnsetCommand();
Junxiao Shi5ec80222014-03-25 20:08:05 -0700284
285 virtual void
Junxiao Shi70911652014-08-12 10:14:24 -0700286 validateRequest(const ControlParameters& parameters) const;
Junxiao Shi5ec80222014-03-25 20:08:05 -0700287
288 virtual void
Junxiao Shi70911652014-08-12 10:14:24 -0700289 validateResponse(const ControlParameters& parameters) const;
Junxiao Shi5ec80222014-03-25 20:08:05 -0700290};
291
Junxiao Shi5f6c74f2014-04-18 16:29:44 -0700292
Alexander Afanasyev4671bf72014-05-19 09:01:37 -0400293/**
294 * \ingroup management
Alexander Afanasyev4671bf72014-05-19 09:01:37 -0400295 * \brief represents a rib/register command
296 * \sa http://redmine.named-data.net/projects/nfd/wiki/RibMgmt#Register-a-route
Junxiao Shi5f6c74f2014-04-18 16:29:44 -0700297 */
298class RibRegisterCommand : public ControlCommand
299{
300public:
Junxiao Shi70911652014-08-12 10:14:24 -0700301 RibRegisterCommand();
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
Alexander Afanasyev4671bf72014-05-19 09:01:37 -0400311/**
312 * \ingroup management
313 * \brief represents a rib/unregister command
314 * \sa http://redmine.named-data.net/projects/nfd/wiki/RibMgmt#Unregister-a-route
Junxiao Shi5f6c74f2014-04-18 16:29:44 -0700315 */
316class RibUnregisterCommand : public ControlCommand
317{
318public:
Junxiao Shi70911652014-08-12 10:14:24 -0700319 RibUnregisterCommand();
Junxiao Shi5f6c74f2014-04-18 16:29:44 -0700320
321 virtual void
Junxiao Shi70911652014-08-12 10:14:24 -0700322 applyDefaultsToRequest(ControlParameters& parameters) const;
Junxiao Shi5f6c74f2014-04-18 16:29:44 -0700323
324 virtual void
Junxiao Shi70911652014-08-12 10:14:24 -0700325 validateResponse(const ControlParameters& parameters) const;
Junxiao Shi5f6c74f2014-04-18 16:29:44 -0700326};
327
328
Junxiao Shi5ec80222014-03-25 20:08:05 -0700329} // namespace nfd
330} // namespace ndn
331
332#endif // NDN_MANAGEMENT_NFD_CONTROL_COMMAND_HPP