]> git.proxmox.com Git - pve-common.git/blame - README.dev
Rework of the installation documentation
[pve-common.git] / README.dev
CommitLineData
a4a9a328 1= Setup PVE Development Environment =
e143e9d8 2
bb9d3865
MB
30. Read https://pve.proxmox.com/wiki/Developer_Documentation
41. Install Debian 9 'stretch'
52. Configure the network interface(s)
63. Change the IP address of your hostname for proper name resolution
7 in /etc/hosts
8 Using 127.0.1.1 will not work, so change it to an IP address from your
9 local network!
a4a9a328 10
bb9d3865
MB
114: Check that the Debian repositories are set properly.
12 See https://wiki.debian.org/SourcesList for more information.
a4a9a328 13
bb9d3865 145. Optional: Install openssh-server and connect via ssh to the host.
a4a9a328 15
bb9d3865
MB
16 run: apt-get update && apt-get install openssh-server
17 Connect via ssh to host and switch user to root
a4a9a328 18
bb9d3865 196. Configure 'pvetest' repository in /etc/apt/sources.list.d/:
8bc53243 20
bb9d3865
MB
21 run: echo "deb http://download.proxmox.com/debian stretch pvetest" > /etc/apt/sources.list.d/pve-development.list
22
237. Add the repository key:
24
25 run: wget -O- "http://download.proxmox.com/debian/proxmox-ve-release-5.x.gpg" | apt-key add -
26
278. run: apt-get update && apt-get dist-upgrade
289. run: apt-get install proxmox-ve
2910. run: mv /etc/apt/sources.list.d/pve-enterprise.list /etc/apt/sources.list.d/pve-enterprise.list.bak
30
3111. You should now have a working Proxmox VE installation.
32 Open a browser: https://<host_IP_address>:8006 e.g. https://10.0.0.90:8006
e143e9d8 33
a4a9a328
DM
34
35= Install build prerequisites for development environment =
47e4eb11 36
bb9d3865
MB
3712. run:
38
1e83e254 39apt-get install build-essential git git-email debhelper \
48e957b9
MR
40autotools-dev autogen dh-autoreconf dkms doxygen check pkg-config \
41groff quilt dpatch automake autoconf libtool lintian libdevel-cycle-perl \
42libjson-perl libcommon-sense-perl liblinux-inotify2-perl libio-stringy-perl \
8bc53243
DM
43libstring-shellquote-perl dh-systemd rpm2cpio libsqlite3-dev sqlite3 \
44libglib2.0-dev librrd-dev librrds-perl rrdcached libdigest-hmac-perl \
45libxml-parser-perl gdb libcrypt-openssl-random-perl \
46libcrypt-openssl-rsa-perl libnet-ldap-perl libauthen-pam-perl \
47libjson-xs-perl libterm-readline-gnu-perl oathtool libmime-base32-perl \
48liboath0 libpci-dev texi2html libsdl1.2-dev libgnutls28-dev \
49libspice-protocol-dev xfslibs-dev libnuma-dev libaio-dev \
1cfd43f6 50pve-libspice-server-dev libusbredirparser-dev glusterfs-common \
8bc53243
DM
51libusb-1.0-0-dev librbd-dev libpopt-dev iproute bridge-utils numactl \
52glusterfs-common ceph-common python-ceph libgoogle-perftools4 \
53libfile-chdir-perl lvm2 glusterfs-client liblockfile-simple-perl \
37640d62 54libsystemd-dev libreadline-gplv2-dev libio-multiplex-perl \
8bc53243
DM
55libnetfilter-log-dev libipset3 ipset socat libsasl2-dev libogg-dev \
56python-pyparsing libfilesys-df-perl libcrypt-ssleay-perl \
57libfile-readbackwards-perl libanyevent-perl libanyevent-http-perl \
692160c1 58unzip liblocale-po-perl libfile-sync-perl cstream \
8bc53243 59lzop dtach apt-transport-https hdparm gdisk parted ttf-dejavu-core \
37640d62 60liblzma-dev dosfstools mtools libxen-dev libfuse-dev corosync-dev \
3ffb1395 61libcpg-dev libquorum-dev libcmap-dev libuuid-perl \
37640d62 62libqb-dev libapparmor-dev docbook2x libcap-dev dh-apparmor \
fe949d0e 63graphviz libseccomp-dev libglib-perl libgtk3-perl libnss3-dev libdlm-dev \
bb9d3865
MB
64libudev-dev asciidoc-dblatex source-highlight libiscsi-dev libiscsi7 \
65librsvg2-bin
66
e143e9d8 67
a4a9a328
DM
68= Compile PVE packages from Source =
69
bb9d3865
MB
7013: Download and install git repositories as Proxmox modules:
71
72 run: mkdir /root/proxmox && cd /root/proxmox
73
74 run: git clone git://git.proxmox.com/git/pve-common.git
75
76 'pve-common.git' is some kind of starting repository and needed for some
77 other repositories as dependency.
78 Install this to get an idea of how the installation process is working.
79
80 See https://git.proxmox.com/ for all available repositories.
81
8214: Most packages can be installed with 'make dinstall' command.
83 run: cd pve-common && make dinstall
84
8515: Reboot the system.
8616. Learn to use the quilt patch scripts.
8717. Happy coding!
e143e9d8
DM
88
89
a4a9a328 90= REST vs. SOAP =
e143e9d8
DM
91
92We decided to change our SOAP API (1.X) and use a REST like API. The
93concept is described in [1] (Resource Oriented Architecture
94(ROA)). The main advantage is that we are able to remove a lot of code
95(the whole SOAP stack) to reduce software complexity.
96
97We also moved away from server side content generation. Instead we use
98the ExtJS Rich Internet Application Framework
99(http://www.sencha.com).
100
101That framework, like any other AJAX toolkit, can talk directly to the
102REST API using JSON. So we were able to remove the server side
103template toolkit completely.
104
a4a9a328 105= JSON and JSON Schema =
e143e9d8
DM
106
107We use JSON as data format, because it is simple and parse-able by any
108web browser.
109
110Additionally, we use JSON Schema [2] to formally describe our API. So
111we can automatically generate the whole API Documentation, and we can
112verify all parameters and return values.
113
60f4e8c7 114A great side effect was that we are able to use JSON Schema to
e143e9d8
DM
115produce command line argument parsers automatically. In fact, the REST
116API and the command line tools use the same code.
117
118Object linkage is done using the JSON Hyper Schema (links property).
119
120A small utility called 'pvesh' exposes the whole REST API on the command
121line.
122
123So here is a summary of the advantage:
124
125 - easy, human readable data format (native web browser format)
126 - automatic parameter verification (we can also verify return values)
127 - automatic generation of API documentation
128 - easy way to create command line tools (using same API).
129
a4a9a328 130= API Implementation (PVE::RESTHandler) =
e143e9d8
DM
131
132All classes exposing methods on the API use PVE::RESTHandler as base class.
133
134 use base qw(PVE::RESTHandler);
135
136To expose methods, one needs to call register_method():
137
138 __PACKAGE__->register_method ($schema);
139
140Where $schema is a PVE method schema as described in
141PVE::JSONSchema. It includes a description of parameters and return
142values, and a reference to the actual code
143
144__PACKAGE__->register_method ({
145 name => 'echo',
146 path => 'echo',
147 method => 'GET',
148 description => "simple return value of parameter 'text'",
149 parameters => {
150 additionalProperties => 0,
151 properties => {
152 text => {
153 type => 'string',
154 }
155 },
156 },
157 returns => {
158 type => 'string',
159 },
160 code => sub {
ef73f03b 161 my ($param) = @_;
e143e9d8
DM
162
163 return $param->{text};
164 }
165});
166
167The 'name' property is only used if you want to call the method
168directly from Perl. You can do that using:
169
170 print __PACKAGE__->echo({ text => "a test" });
171
172We use Perl's AUTOLOAD feature to implement this. Note: You need to
173pass parameters a HASH reference.
174
175There is a special helper method called cli_handler(). This is used by
176the CLIHandler Class for command line tools, where you want to pass
177arguments as array of strings. This uses Getopt::Long to parse parameters.
178
179There is a second way to map names to methods - using the 'path'
180property. And you can register subclasses. That way you can set up a
181filesystem like hierarchy to access methods.
182
183Here is an example:
184----------------------------
185package C1;
186
187__PACKAGE__->register_method ({
188 subclass => "C2",
189 path => 'sub2',
190});
191
192
193__PACKAGE__->register_method ({
194 name => 'list1',
195 path => 'index',
196 method => 'GET',
197 ...
198});
199
200package C2;
201
202__PACKAGE__->register_method ({
203 name => 'list2',
204 path => 'index',
205 method => 'GET',
206 ...
207});
208-------------------------------
209
210The utily method find_handler (in PVE::RESTHandler) can be use to do
211'path' related method lookups.
212
213C1->find_handler('GET', "/index") => C1::list1
214C1->find_handler('GET', "/sub2/index") => C2::list2
215
216The HTTP server use the URL (a path) to find the corresponding method.
217
218
a4a9a328
DM
219= References =
220
e143e9d8
DM
221[1] RESTful Web Services
222Web services for the real world
223
224By
225 Leonard Richardson, Sam Ruby
226Publisher:
227 O'Reilly Media
228Released:
229 May 2007
230
231[2] JSON Schema links: http://json-schema.org/