blob: bc4ef5390382e2c5229605a72ee9cba4e222ca2e [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"
26#include "../util/command-interest-generator.hpp"
27
28namespace ndn {
29namespace nfd {
30
Alexander Afanasyev4671bf72014-05-19 09:01:37 -040031/**
32 * \ingroup management
33 * \brief base class of NFD ControlCommand
34 * \sa http://redmine.named-data.net/projects/nfd/wiki/ControlCommand
Junxiao Shi5ec80222014-03-25 20:08:05 -070035 */
Junxiao Shi7b6b79d2014-03-26 20:59:35 -070036class ControlCommand : noncopyable
Junxiao Shi5ec80222014-03-25 20:08:05 -070037{
38public:
39 /** \brief represents an error in ControlParameters
40 */
41 class ArgumentError : public std::invalid_argument
42 {
43 public:
44 explicit
45 ArgumentError(const std::string& what)
46 : std::invalid_argument(what)
47 {
48 }
49 };
50
51 /** \return Name prefix of this ControlCommand
52 */
53 const Name&
54 getPrefix() const
55 {
56 return m_prefix;
57 }
58
Junxiao Shi5ec80222014-03-25 20:08:05 -070059 /** \brief validate request parameters
60 * \throw ArgumentError
61 */
62 virtual void
Junxiao Shi70911652014-08-12 10:14:24 -070063 validateRequest(const ControlParameters& parameters) const;
Junxiao Shi5ec80222014-03-25 20:08:05 -070064
65 /** \brief apply default values to missing fields in request
66 */
67 virtual void
Junxiao Shi70911652014-08-12 10:14:24 -070068 applyDefaultsToRequest(ControlParameters& parameters) const;
Junxiao Shi5ec80222014-03-25 20:08:05 -070069
70 /** \brief validate response parameters
71 * \throw ArgumentError
72 */
73 virtual void
Junxiao Shi70911652014-08-12 10:14:24 -070074 validateResponse(const ControlParameters& parameters) const;
Junxiao Shi5ec80222014-03-25 20:08:05 -070075
76 /** \brief apply default values to missing fields in response
77 */
78 virtual void
Junxiao Shi70911652014-08-12 10:14:24 -070079 applyDefaultsToResponse(ControlParameters& parameters) const;
80
81 /** \brief construct the Name for a request Interest
82 */
83 Name
84 getRequestName(const ControlParameters& parameters) const;
85
86public: // deprecated
87 /** \brief a callback on signing command interest
88 */
89 typedef function<void(Interest&)> Sign;
90
91 /** \brief make a Command Interest from parameters
92 * \deprecated use .getCommandName and sign with KeyChain
93 */
94 Interest
95 makeCommandInterest(const ControlParameters& parameters,
96 const Sign& sign) const;
Junxiao Shi5ec80222014-03-25 20:08:05 -070097
98protected:
Junxiao Shi70911652014-08-12 10:14:24 -070099 ControlCommand(const std::string& module, const std::string& verb);
Junxiao Shi5ec80222014-03-25 20:08:05 -0700100
101 class FieldValidator
102 {
103 public:
Junxiao Shi70911652014-08-12 10:14:24 -0700104 FieldValidator();
Junxiao Shi5ec80222014-03-25 20:08:05 -0700105
106 /** \brief declare a required field
107 */
108 FieldValidator&
109 required(ControlParameterField field)
110 {
111 m_required[field] = true;
112 return *this;
113 }
114
115 /** \brief declare an optional field
116 */
117 FieldValidator&
118 optional(ControlParameterField field)
119 {
120 m_optional[field] = true;
121 return *this;
122 }
123
124 /** \brief verify that all required fields are present,
125 * and all present fields are either required or optional
126 * \throw ArgumentError
127 */
128 void
Junxiao Shi70911652014-08-12 10:14:24 -0700129 validate(const ControlParameters& parameters) const;
Junxiao Shi5ec80222014-03-25 20:08:05 -0700130
131 private:
132 std::vector<bool> m_required;
133 std::vector<bool> m_optional;
134 };
135
136protected:
137 /** \brief FieldValidator for request ControlParameters
138 *
139 * Constructor of subclass should populate this validator.
140 */
141 FieldValidator m_requestValidator;
142 /** \brief FieldValidator for response ControlParameters
143 *
144 * Constructor of subclass should populate this validator.
145 */
146 FieldValidator m_responseValidator;
147
148private:
149 Name m_prefix;
150};
151
152
Alexander Afanasyev4671bf72014-05-19 09:01:37 -0400153/**
154 * \ingroup management
155 * \brief represents a faces/create command
156 * \sa http://redmine.named-data.net/projects/nfd/wiki/FaceMgmt#Create-a-face
Junxiao Shi5ec80222014-03-25 20:08:05 -0700157 */
158class FaceCreateCommand : public ControlCommand
159{
160public:
Junxiao Shi70911652014-08-12 10:14:24 -0700161 FaceCreateCommand();
Junxiao Shi5ec80222014-03-25 20:08:05 -0700162
163 virtual void
Junxiao Shi70911652014-08-12 10:14:24 -0700164 validateResponse(const ControlParameters& parameters) const;
Junxiao Shi5ec80222014-03-25 20:08:05 -0700165};
166
167
Alexander Afanasyev4671bf72014-05-19 09:01:37 -0400168/**
169 * \ingroup management
170 * \brief represents a faces/destroy command
171 * \sa http://redmine.named-data.net/projects/nfd/wiki/FaceMgmt#Destroy-a-face
Junxiao Shi5ec80222014-03-25 20:08:05 -0700172 */
173class FaceDestroyCommand : public ControlCommand
174{
175public:
Junxiao Shi70911652014-08-12 10:14:24 -0700176 FaceDestroyCommand();
Junxiao Shi5ec80222014-03-25 20:08:05 -0700177
178 virtual void
Junxiao Shi70911652014-08-12 10:14:24 -0700179 validateRequest(const ControlParameters& parameters) const;
Junxiao Shi5ec80222014-03-25 20:08:05 -0700180
181 virtual void
Junxiao Shi70911652014-08-12 10:14:24 -0700182 validateResponse(const ControlParameters& parameters) const;
Junxiao Shi5ec80222014-03-25 20:08:05 -0700183};
184
Alexander Afanasyev4671bf72014-05-19 09:01:37 -0400185/**
186 * \ingroup management
187 * \brief Base class for faces/[*]-local-control commands
188 */
Junxiao Shi5ec80222014-03-25 20:08:05 -0700189class FaceLocalControlCommand : public ControlCommand
190{
Junxiao Shi6888bc12014-03-29 23:01:41 -0700191public:
192 virtual void
Junxiao Shi70911652014-08-12 10:14:24 -0700193 validateRequest(const ControlParameters& parameters) const;
Junxiao Shi6888bc12014-03-29 23:01:41 -0700194
195 virtual void
Junxiao Shi70911652014-08-12 10:14:24 -0700196 validateResponse(const ControlParameters& parameters) const;
Junxiao Shi6888bc12014-03-29 23:01:41 -0700197
Junxiao Shi5ec80222014-03-25 20:08:05 -0700198protected:
199 explicit
Junxiao Shi70911652014-08-12 10:14:24 -0700200 FaceLocalControlCommand(const std::string& verb);
Junxiao Shi5ec80222014-03-25 20:08:05 -0700201};
202
203
Alexander Afanasyev4671bf72014-05-19 09:01:37 -0400204/**
205 * \ingroup management
206 * \brief represents a faces/enable-local-control command
207 * \sa http://redmine.named-data.net/projects/nfd/wiki/FaceMgmt#Enable-a-LocalControlHeader-feature
Junxiao Shi5ec80222014-03-25 20:08:05 -0700208 */
209class FaceEnableLocalControlCommand : public FaceLocalControlCommand
210{
211public:
Junxiao Shi70911652014-08-12 10:14:24 -0700212 FaceEnableLocalControlCommand();
Junxiao Shi5ec80222014-03-25 20:08:05 -0700213};
214
215
Alexander Afanasyev4671bf72014-05-19 09:01:37 -0400216/**
217 * \ingroup management
218 * \brief represents a faces/disable-local-control command
219 * \sa http://redmine.named-data.net/projects/nfd/wiki/FaceMgmt#Disable-a-LocalControlHeader-feature
Junxiao Shi5ec80222014-03-25 20:08:05 -0700220 */
221class FaceDisableLocalControlCommand : public FaceLocalControlCommand
222{
223public:
Junxiao Shi70911652014-08-12 10:14:24 -0700224 FaceDisableLocalControlCommand();
Junxiao Shi5ec80222014-03-25 20:08:05 -0700225};
226
227
Alexander Afanasyev4671bf72014-05-19 09:01:37 -0400228/**
229 * \ingroup management
230 * \brief represents a fib/add-nexthop command
231 * \sa http://redmine.named-data.net/projects/nfd/wiki/FibMgmt#Add-a-nexthop
Junxiao Shi5ec80222014-03-25 20:08:05 -0700232 */
233class FibAddNextHopCommand : public ControlCommand
234{
235public:
Junxiao Shi70911652014-08-12 10:14:24 -0700236 FibAddNextHopCommand();
Junxiao Shi5ec80222014-03-25 20:08:05 -0700237
238 virtual void
Junxiao Shi70911652014-08-12 10:14:24 -0700239 applyDefaultsToRequest(ControlParameters& parameters) const;
Junxiao Shi5ec80222014-03-25 20:08:05 -0700240
241 virtual void
Junxiao Shi70911652014-08-12 10:14:24 -0700242 validateResponse(const ControlParameters& parameters) const;
Junxiao Shi5ec80222014-03-25 20:08:05 -0700243};
244
245
Alexander Afanasyev4671bf72014-05-19 09:01:37 -0400246/**
247 * \ingroup management
248 * \brief represents a fib/remove-nexthop command
249 * \sa http://redmine.named-data.net/projects/nfd/wiki/FibMgmt#Remove-a-nexthop
Junxiao Shi5ec80222014-03-25 20:08:05 -0700250 */
251class FibRemoveNextHopCommand : public ControlCommand
252{
253public:
Junxiao Shi70911652014-08-12 10:14:24 -0700254 FibRemoveNextHopCommand();
Junxiao Shi5ec80222014-03-25 20:08:05 -0700255
256 virtual void
Junxiao Shi70911652014-08-12 10:14:24 -0700257 applyDefaultsToRequest(ControlParameters& parameters) const;
Junxiao Shicaac54e2014-05-20 15:27:01 -0700258
259 virtual void
Junxiao Shi70911652014-08-12 10:14:24 -0700260 validateResponse(const ControlParameters& parameters) const;
Junxiao Shi5ec80222014-03-25 20:08:05 -0700261};
262
263
Alexander Afanasyev4671bf72014-05-19 09:01:37 -0400264/**
265 * \ingroup management
266 * \brief represents a strategy-choice/set command
267 * \sa http://redmine.named-data.net/projects/nfd/wiki/StrategyChoice#Set-the-strategy-for-a-namespace
Junxiao Shi5ec80222014-03-25 20:08:05 -0700268 */
269class StrategyChoiceSetCommand : public ControlCommand
270{
271public:
Junxiao Shi70911652014-08-12 10:14:24 -0700272 StrategyChoiceSetCommand();
Junxiao Shi5ec80222014-03-25 20:08:05 -0700273};
274
275
Alexander Afanasyev4671bf72014-05-19 09:01:37 -0400276/**
277 * \ingroup management
278 * \brief represents a strategy-choice/set command
279 * \sa http://redmine.named-data.net/projects/nfd/wiki/StrategyChoice#Unset-the-strategy-for-a-namespace
Junxiao Shi5ec80222014-03-25 20:08:05 -0700280 */
281class StrategyChoiceUnsetCommand : public ControlCommand
282{
283public:
Junxiao Shi70911652014-08-12 10:14:24 -0700284 StrategyChoiceUnsetCommand();
Junxiao Shi5ec80222014-03-25 20:08:05 -0700285
286 virtual void
Junxiao Shi70911652014-08-12 10:14:24 -0700287 validateRequest(const ControlParameters& parameters) const;
Junxiao Shi5ec80222014-03-25 20:08:05 -0700288
289 virtual void
Junxiao Shi70911652014-08-12 10:14:24 -0700290 validateResponse(const ControlParameters& parameters) const;
Junxiao Shi5ec80222014-03-25 20:08:05 -0700291};
292
Junxiao Shi5f6c74f2014-04-18 16:29:44 -0700293
Alexander Afanasyev4671bf72014-05-19 09:01:37 -0400294/**
295 * \ingroup management
Alexander Afanasyev4671bf72014-05-19 09:01:37 -0400296 * \brief represents a rib/register command
297 * \sa http://redmine.named-data.net/projects/nfd/wiki/RibMgmt#Register-a-route
Junxiao Shi5f6c74f2014-04-18 16:29:44 -0700298 */
299class RibRegisterCommand : public ControlCommand
300{
301public:
Junxiao Shi70911652014-08-12 10:14:24 -0700302 RibRegisterCommand();
Junxiao Shi5f6c74f2014-04-18 16:29:44 -0700303
304 virtual void
Junxiao Shi70911652014-08-12 10:14:24 -0700305 applyDefaultsToRequest(ControlParameters& parameters) const;
Junxiao Shi5f6c74f2014-04-18 16:29:44 -0700306
307 virtual void
Junxiao Shi70911652014-08-12 10:14:24 -0700308 validateResponse(const ControlParameters& parameters) const;
Junxiao Shi5f6c74f2014-04-18 16:29:44 -0700309};
310
311
Alexander Afanasyev4671bf72014-05-19 09:01:37 -0400312/**
313 * \ingroup management
314 * \brief represents a rib/unregister command
315 * \sa http://redmine.named-data.net/projects/nfd/wiki/RibMgmt#Unregister-a-route
Junxiao Shi5f6c74f2014-04-18 16:29:44 -0700316 */
317class RibUnregisterCommand : public ControlCommand
318{
319public:
Junxiao Shi70911652014-08-12 10:14:24 -0700320 RibUnregisterCommand();
Junxiao Shi5f6c74f2014-04-18 16:29:44 -0700321
322 virtual void
Junxiao Shi70911652014-08-12 10:14:24 -0700323 applyDefaultsToRequest(ControlParameters& parameters) const;
Junxiao Shi5f6c74f2014-04-18 16:29:44 -0700324
325 virtual void
Junxiao Shi70911652014-08-12 10:14:24 -0700326 validateResponse(const ControlParameters& parameters) const;
Junxiao Shi5f6c74f2014-04-18 16:29:44 -0700327};
328
329
Junxiao Shi5ec80222014-03-25 20:08:05 -0700330} // namespace nfd
331} // namespace ndn
332
333#endif // NDN_MANAGEMENT_NFD_CONTROL_COMMAND_HPP