blob: dfe876b7bd957c47fcb1d34a75f4d8f6c07a0d19 [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
Davide Pesaventoaeeb3fc2016-08-14 03:40:02 +0200151 validateResponse(const ControlParameters& parameters) const override;
Junxiao Shi5ec80222014-03-25 20:08:05 -0700152};
153
Davide Pesaventoaeeb3fc2016-08-14 03:40:02 +0200154
Yanbiao Licbdacb22016-08-02 16:02:35 +0800155/**
156 * \ingroup management
157 * \brief represents a faces/update command
158 * \sa http://redmine.named-data.net/projects/nfd/wiki/FaceMgmt#Update-a-face
159 */
160class FaceUpdateCommand : public ControlCommand
161{
162public:
163 FaceUpdateCommand();
164
165 virtual void
Davide Pesaventoaeeb3fc2016-08-14 03:40:02 +0200166 validateRequest(const ControlParameters& parameters) const override;
Yanbiao Licbdacb22016-08-02 16:02:35 +0800167
168 virtual void
Davide Pesaventoaeeb3fc2016-08-14 03:40:02 +0200169 validateResponse(const ControlParameters& parameters) const override;
Yanbiao Licbdacb22016-08-02 16:02:35 +0800170};
Junxiao Shi5ec80222014-03-25 20:08:05 -0700171
Davide Pesaventoaeeb3fc2016-08-14 03:40:02 +0200172
Alexander Afanasyev4671bf72014-05-19 09:01:37 -0400173/**
174 * \ingroup management
175 * \brief represents a faces/destroy command
176 * \sa http://redmine.named-data.net/projects/nfd/wiki/FaceMgmt#Destroy-a-face
Junxiao Shi5ec80222014-03-25 20:08:05 -0700177 */
178class FaceDestroyCommand : public ControlCommand
179{
180public:
Junxiao Shi70911652014-08-12 10:14:24 -0700181 FaceDestroyCommand();
Junxiao Shi5ec80222014-03-25 20:08:05 -0700182
183 virtual void
Davide Pesaventoaeeb3fc2016-08-14 03:40:02 +0200184 validateRequest(const ControlParameters& parameters) const override;
Junxiao Shi5ec80222014-03-25 20:08:05 -0700185
186 virtual void
Davide Pesaventoaeeb3fc2016-08-14 03:40:02 +0200187 validateResponse(const ControlParameters& parameters) const override;
Junxiao Shi5ec80222014-03-25 20:08:05 -0700188};
189
Davide Pesaventoaeeb3fc2016-08-14 03:40:02 +0200190
Alexander Afanasyev4671bf72014-05-19 09:01:37 -0400191/**
192 * \ingroup management
193 * \brief Base class for faces/[*]-local-control commands
194 */
Junxiao Shi5ec80222014-03-25 20:08:05 -0700195class FaceLocalControlCommand : public ControlCommand
196{
Junxiao Shi6888bc12014-03-29 23:01:41 -0700197public:
198 virtual void
Davide Pesaventoaeeb3fc2016-08-14 03:40:02 +0200199 validateRequest(const ControlParameters& parameters) const override;
Junxiao Shi6888bc12014-03-29 23:01:41 -0700200
201 virtual void
Davide Pesaventoaeeb3fc2016-08-14 03:40:02 +0200202 validateResponse(const ControlParameters& parameters) const override;
Junxiao Shi6888bc12014-03-29 23:01:41 -0700203
Junxiao Shi5ec80222014-03-25 20:08:05 -0700204protected:
205 explicit
Junxiao Shi70911652014-08-12 10:14:24 -0700206 FaceLocalControlCommand(const std::string& verb);
Junxiao Shi5ec80222014-03-25 20:08:05 -0700207};
208
209
Alexander Afanasyev4671bf72014-05-19 09:01:37 -0400210/**
211 * \ingroup management
212 * \brief represents a faces/enable-local-control command
213 * \sa http://redmine.named-data.net/projects/nfd/wiki/FaceMgmt#Enable-a-LocalControlHeader-feature
Junxiao Shi5ec80222014-03-25 20:08:05 -0700214 */
215class FaceEnableLocalControlCommand : public FaceLocalControlCommand
216{
217public:
Junxiao Shi70911652014-08-12 10:14:24 -0700218 FaceEnableLocalControlCommand();
Junxiao Shi5ec80222014-03-25 20:08:05 -0700219};
220
221
Alexander Afanasyev4671bf72014-05-19 09:01:37 -0400222/**
223 * \ingroup management
224 * \brief represents a faces/disable-local-control command
225 * \sa http://redmine.named-data.net/projects/nfd/wiki/FaceMgmt#Disable-a-LocalControlHeader-feature
Junxiao Shi5ec80222014-03-25 20:08:05 -0700226 */
227class FaceDisableLocalControlCommand : public FaceLocalControlCommand
228{
229public:
Junxiao Shi70911652014-08-12 10:14:24 -0700230 FaceDisableLocalControlCommand();
Junxiao Shi5ec80222014-03-25 20:08:05 -0700231};
232
233
Alexander Afanasyev4671bf72014-05-19 09:01:37 -0400234/**
235 * \ingroup management
236 * \brief represents a fib/add-nexthop command
237 * \sa http://redmine.named-data.net/projects/nfd/wiki/FibMgmt#Add-a-nexthop
Junxiao Shi5ec80222014-03-25 20:08:05 -0700238 */
239class FibAddNextHopCommand : public ControlCommand
240{
241public:
Junxiao Shi70911652014-08-12 10:14:24 -0700242 FibAddNextHopCommand();
Junxiao Shi5ec80222014-03-25 20:08:05 -0700243
244 virtual void
Davide Pesaventoaeeb3fc2016-08-14 03:40:02 +0200245 applyDefaultsToRequest(ControlParameters& parameters) const override;
Junxiao Shi5ec80222014-03-25 20:08:05 -0700246
247 virtual void
Davide Pesaventoaeeb3fc2016-08-14 03:40:02 +0200248 validateResponse(const ControlParameters& parameters) const override;
Junxiao Shi5ec80222014-03-25 20:08:05 -0700249};
250
251
Alexander Afanasyev4671bf72014-05-19 09:01:37 -0400252/**
253 * \ingroup management
254 * \brief represents a fib/remove-nexthop command
255 * \sa http://redmine.named-data.net/projects/nfd/wiki/FibMgmt#Remove-a-nexthop
Junxiao Shi5ec80222014-03-25 20:08:05 -0700256 */
257class FibRemoveNextHopCommand : public ControlCommand
258{
259public:
Junxiao Shi70911652014-08-12 10:14:24 -0700260 FibRemoveNextHopCommand();
Junxiao Shi5ec80222014-03-25 20:08:05 -0700261
262 virtual void
Davide Pesaventoaeeb3fc2016-08-14 03:40:02 +0200263 applyDefaultsToRequest(ControlParameters& parameters) const override;
Junxiao Shicaac54e2014-05-20 15:27:01 -0700264
265 virtual void
Davide Pesaventoaeeb3fc2016-08-14 03:40:02 +0200266 validateResponse(const ControlParameters& parameters) const override;
Junxiao Shi5ec80222014-03-25 20:08:05 -0700267};
268
269
Alexander Afanasyev4671bf72014-05-19 09:01:37 -0400270/**
271 * \ingroup management
272 * \brief represents a strategy-choice/set command
273 * \sa http://redmine.named-data.net/projects/nfd/wiki/StrategyChoice#Set-the-strategy-for-a-namespace
Junxiao Shi5ec80222014-03-25 20:08:05 -0700274 */
275class StrategyChoiceSetCommand : public ControlCommand
276{
277public:
Junxiao Shi70911652014-08-12 10:14:24 -0700278 StrategyChoiceSetCommand();
Junxiao Shi5ec80222014-03-25 20:08:05 -0700279};
280
281
Alexander Afanasyev4671bf72014-05-19 09:01:37 -0400282/**
283 * \ingroup management
284 * \brief represents a strategy-choice/set command
285 * \sa http://redmine.named-data.net/projects/nfd/wiki/StrategyChoice#Unset-the-strategy-for-a-namespace
Junxiao Shi5ec80222014-03-25 20:08:05 -0700286 */
287class StrategyChoiceUnsetCommand : public ControlCommand
288{
289public:
Junxiao Shi70911652014-08-12 10:14:24 -0700290 StrategyChoiceUnsetCommand();
Junxiao Shi5ec80222014-03-25 20:08:05 -0700291
292 virtual void
Davide Pesaventoaeeb3fc2016-08-14 03:40:02 +0200293 validateRequest(const ControlParameters& parameters) const override;
Junxiao Shi5ec80222014-03-25 20:08:05 -0700294
295 virtual void
Davide Pesaventoaeeb3fc2016-08-14 03:40:02 +0200296 validateResponse(const ControlParameters& parameters) const override;
Junxiao Shi5ec80222014-03-25 20:08:05 -0700297};
298
Junxiao Shi5f6c74f2014-04-18 16:29:44 -0700299
Alexander Afanasyev4671bf72014-05-19 09:01:37 -0400300/**
301 * \ingroup management
Alexander Afanasyev4671bf72014-05-19 09:01:37 -0400302 * \brief represents a rib/register command
303 * \sa http://redmine.named-data.net/projects/nfd/wiki/RibMgmt#Register-a-route
Junxiao Shi5f6c74f2014-04-18 16:29:44 -0700304 */
305class RibRegisterCommand : public ControlCommand
306{
307public:
Junxiao Shi70911652014-08-12 10:14:24 -0700308 RibRegisterCommand();
Junxiao Shi5f6c74f2014-04-18 16:29:44 -0700309
310 virtual void
Davide Pesaventoaeeb3fc2016-08-14 03:40:02 +0200311 applyDefaultsToRequest(ControlParameters& parameters) const override;
Junxiao Shi5f6c74f2014-04-18 16:29:44 -0700312
313 virtual void
Davide Pesaventoaeeb3fc2016-08-14 03:40:02 +0200314 validateResponse(const ControlParameters& parameters) const override;
Junxiao Shi5f6c74f2014-04-18 16:29:44 -0700315};
316
317
Alexander Afanasyev4671bf72014-05-19 09:01:37 -0400318/**
319 * \ingroup management
320 * \brief represents a rib/unregister command
321 * \sa http://redmine.named-data.net/projects/nfd/wiki/RibMgmt#Unregister-a-route
Junxiao Shi5f6c74f2014-04-18 16:29:44 -0700322 */
323class RibUnregisterCommand : public ControlCommand
324{
325public:
Junxiao Shi70911652014-08-12 10:14:24 -0700326 RibUnregisterCommand();
Junxiao Shi5f6c74f2014-04-18 16:29:44 -0700327
328 virtual void
Davide Pesaventoaeeb3fc2016-08-14 03:40:02 +0200329 applyDefaultsToRequest(ControlParameters& parameters) const override;
Junxiao Shi5f6c74f2014-04-18 16:29:44 -0700330
331 virtual void
Davide Pesaventoaeeb3fc2016-08-14 03:40:02 +0200332 validateResponse(const ControlParameters& parameters) const override;
Junxiao Shi5f6c74f2014-04-18 16:29:44 -0700333};
334
Junxiao Shi5ec80222014-03-25 20:08:05 -0700335} // namespace nfd
336} // namespace ndn
337
338#endif // NDN_MANAGEMENT_NFD_CONTROL_COMMAND_HPP