]> git.proxmox.com Git - pve-common.git/blame - README.dev
bump version for Debian Jessie
[pve-common.git] / README.dev
CommitLineData
e143e9d8 1====================================
47e4eb11 2Setup PVE Development Environment
e143e9d8
DM
3====================================
4
47e4eb11 51. Install Debian 'jessie'
e143e9d8
DM
62. Install prerequisites for development environment:
7
47e4eb11
DM
8# new jessie depends
9apt-get -y install build-essential git-core debhelper autotools-dev \
10doxygen check pkg-config groff quilt dpatch automake autoconf libtool \
11lintian libdevel-cycle-perl libjson-perl libcommon-sense-perl \
12liblinux-inotify2-perl libio-stringy-perl libstring-shellquote-perl \
13dh-systemd rpm2cpio libsqlite3-dev sqlite3 libglib2.0-dev librrd-dev \
14librrds-perl rrdcached libdigest-hmac-perl libxml-parser-perl \
15gdb
16
17# old wheezy depends
7da024b1 18apt-get -y install build-essential git-core debhelper autotools-dev \
e143e9d8
DM
19doxygen check pkg-config libnss3-dev groff quilt dpatch libxml2-dev \
20libncurses5-dev libslang2-dev libldap2-dev xsltproc python-pexpect \
21python-pycurl libdbus-1-dev openipmi sg3-utils libnet-snmp-perl \
22libnet-telnet-perl snmp python-openssl libxml2-utils automake autoconf \
23libsqlite3-dev sqlite3 libfuse-dev libglib2.0-dev librrd-dev \
24librrds-perl rrdcached lintian libdevel-cycle-perl libjson-perl \
25liblinux-inotify2-perl libio-stringy-perl unzip fuse-utils \
26libcrypt-openssl-random-perl libcrypt-openssl-rsa-perl \
27libauthen-pam-perl libterm-readline-gnu-perl libssl-dev open-iscsi \
28libapache2-mod-perl2 libfilesys-df-perl libfile-readbackwards-perl \
29libpci-dev texi2html libgnutls-dev libsdl1.2-dev bridge-utils \
30libvncserver0 rpm2cpio apache2-mpm-prefork libintl-perl \
31libapache2-request-perl libnet-dns-perl vlan libio-socket-ssl-perl \
67799787 32libfile-sync-perl ifenslave-2.6 libnet-ldap-perl console-data \
60f4e8c7
DM
33libtool dietlibc-dev liblocale-po-perl libstring-shellquote-perl \
34libio-multiplex-perl liblockfile-simple-perl
e143e9d8 35
7da024b1 363. Download and install the following git modules in order from top to bottom:
e143e9d8 37
7da024b1 38# git clone git://git.proxmox.com/git/<PACKAGE.git>
e143e9d8 39
7da024b1
DM
40You currently need the following packages:
41
47e4eb11 42libqb.git
7da024b1
DM
43corosync-pve.git
44openais-pve.git
45pve-common.git
46pve-cluster.git
47redhat-cluster-pve.git
56d42b76 48lvm.git
7da024b1
DM
49pve-access-control.git
50pve-storage.git
51pve-qemu-kvm.git
52qemu-server.git
53vncterm.git
60f4e8c7 54vzquota.git
b2b9ba38 55vzctl.git
60f4e8c7
DM
56fence-agents-pve.git
57resource-agents-pve.git
7da024b1
DM
58pve-manager.git
59pve-kernel-2.6.32.git
60f4e8c7
DM
60libiscsi.git
61gfs2-utils.git
62ksm-control-daemon.git
e143e9d8 63
60f4e8c7 64Most packages can be installed with 'make dinstall' command.
e143e9d8
DM
65
664. Reboot the system.
675. Learn to use the quilt patch scripts.
686. Happy coding.
69
70There is an experimental package containing the API documentation
71as ExtJS application:
72
7da024b1
DM
73pve2-api-doc.git
74
75You can view the source code at:
76
77https://git.proxmox.com
e143e9d8
DM
78
79
80REST vs. SOAP
81=============
82
83We decided to change our SOAP API (1.X) and use a REST like API. The
84concept is described in [1] (Resource Oriented Architecture
85(ROA)). The main advantage is that we are able to remove a lot of code
86(the whole SOAP stack) to reduce software complexity.
87
88We also moved away from server side content generation. Instead we use
89the ExtJS Rich Internet Application Framework
90(http://www.sencha.com).
91
92That framework, like any other AJAX toolkit, can talk directly to the
93REST API using JSON. So we were able to remove the server side
94template toolkit completely.
95
96JSON and JSON Schema
97====================
98
99We use JSON as data format, because it is simple and parse-able by any
100web browser.
101
102Additionally, we use JSON Schema [2] to formally describe our API. So
103we can automatically generate the whole API Documentation, and we can
104verify all parameters and return values.
105
60f4e8c7 106A great side effect was that we are able to use JSON Schema to
e143e9d8
DM
107produce command line argument parsers automatically. In fact, the REST
108API and the command line tools use the same code.
109
110Object linkage is done using the JSON Hyper Schema (links property).
111
112A small utility called 'pvesh' exposes the whole REST API on the command
113line.
114
115So here is a summary of the advantage:
116
117 - easy, human readable data format (native web browser format)
118 - automatic parameter verification (we can also verify return values)
119 - automatic generation of API documentation
120 - easy way to create command line tools (using same API).
121
122API Implementation (PVE::RESTHandler)
123=====================================
124
125All classes exposing methods on the API use PVE::RESTHandler as base class.
126
127 use base qw(PVE::RESTHandler);
128
129To expose methods, one needs to call register_method():
130
131 __PACKAGE__->register_method ($schema);
132
133Where $schema is a PVE method schema as described in
134PVE::JSONSchema. It includes a description of parameters and return
135values, and a reference to the actual code
136
137__PACKAGE__->register_method ({
138 name => 'echo',
139 path => 'echo',
140 method => 'GET',
141 description => "simple return value of parameter 'text'",
142 parameters => {
143 additionalProperties => 0,
144 properties => {
145 text => {
146 type => 'string',
147 }
148 },
149 },
150 returns => {
151 type => 'string',
152 },
153 code => sub {
154 my ($conn, $resp, $param) = @_;
155
156 return $param->{text};
157 }
158});
159
160The 'name' property is only used if you want to call the method
161directly from Perl. You can do that using:
162
163 print __PACKAGE__->echo({ text => "a test" });
164
165We use Perl's AUTOLOAD feature to implement this. Note: You need to
166pass parameters a HASH reference.
167
168There is a special helper method called cli_handler(). This is used by
169the CLIHandler Class for command line tools, where you want to pass
170arguments as array of strings. This uses Getopt::Long to parse parameters.
171
172There is a second way to map names to methods - using the 'path'
173property. And you can register subclasses. That way you can set up a
174filesystem like hierarchy to access methods.
175
176Here is an example:
177----------------------------
178package C1;
179
180__PACKAGE__->register_method ({
181 subclass => "C2",
182 path => 'sub2',
183});
184
185
186__PACKAGE__->register_method ({
187 name => 'list1',
188 path => 'index',
189 method => 'GET',
190 ...
191});
192
193package C2;
194
195__PACKAGE__->register_method ({
196 name => 'list2',
197 path => 'index',
198 method => 'GET',
199 ...
200});
201-------------------------------
202
203The utily method find_handler (in PVE::RESTHandler) can be use to do
204'path' related method lookups.
205
206C1->find_handler('GET', "/index") => C1::list1
207C1->find_handler('GET', "/sub2/index") => C2::list2
208
209The HTTP server use the URL (a path) to find the corresponding method.
210
211
212References
213==========
214[1] RESTful Web Services
215Web services for the real world
216
217By
218 Leonard Richardson, Sam Ruby
219Publisher:
220 O'Reilly Media
221Released:
222 May 2007
223
224[2] JSON Schema links: http://json-schema.org/