1 /*
2  * qemu_migration.h: QEMU migration handling
3  *
4  * Copyright (C) 2006-2011, 2014 Red Hat, Inc.
5  *
6  * This library is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation; either
9  * version 2.1 of the License, or (at your option) any later version.
10  *
11  * This library is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with this library.  If not, see
18  * <http://www.gnu.org/licenses/>.
19  *
20  */
21 
22 #pragma once
23 
24 #include "qemu_conf.h"
25 #include "qemu_domain.h"
26 #include "qemu_migration_params.h"
27 #include "virenum.h"
28 
29 /*
30  * General function naming conventions:
31  *
32  *  - qemuMigrationSrcXXX - only runs on source host
33  *  - qemuMigrationDstXXX - only runs on dest host
34  *  - qemuMigrationAnyXXX - runs on source or dest host
35  *
36  * Exceptions:
37  *
38  *  - qemuMigrationOptionXXX - runs on source or dest host
39  *  - qemuMigrationJobXXX - runs on source or dest host
40  */
41 
42 /* All supported qemu migration flags.  */
43 #define QEMU_MIGRATION_FLAGS \
44     (VIR_MIGRATE_LIVE | \
45      VIR_MIGRATE_PEER2PEER | \
46      VIR_MIGRATE_TUNNELLED | \
47      VIR_MIGRATE_PERSIST_DEST | \
48      VIR_MIGRATE_UNDEFINE_SOURCE | \
49      VIR_MIGRATE_PAUSED | \
50      VIR_MIGRATE_NON_SHARED_DISK | \
51      VIR_MIGRATE_NON_SHARED_INC | \
52      VIR_MIGRATE_CHANGE_PROTECTION | \
53      VIR_MIGRATE_UNSAFE | \
54      VIR_MIGRATE_OFFLINE | \
55      VIR_MIGRATE_COMPRESSED | \
56      VIR_MIGRATE_ABORT_ON_ERROR | \
57      VIR_MIGRATE_AUTO_CONVERGE | \
58      VIR_MIGRATE_RDMA_PIN_ALL | \
59      VIR_MIGRATE_POSTCOPY | \
60      VIR_MIGRATE_TLS | \
61      VIR_MIGRATE_PARALLEL | \
62      0)
63 
64 /* All supported migration parameters and their types. */
65 #define QEMU_MIGRATION_PARAMETERS \
66     VIR_MIGRATE_PARAM_URI,              VIR_TYPED_PARAM_STRING, \
67     VIR_MIGRATE_PARAM_DEST_NAME,        VIR_TYPED_PARAM_STRING, \
68     VIR_MIGRATE_PARAM_DEST_XML,         VIR_TYPED_PARAM_STRING, \
69     VIR_MIGRATE_PARAM_BANDWIDTH,        VIR_TYPED_PARAM_ULLONG, \
70     VIR_MIGRATE_PARAM_GRAPHICS_URI,     VIR_TYPED_PARAM_STRING, \
71     VIR_MIGRATE_PARAM_LISTEN_ADDRESS,   VIR_TYPED_PARAM_STRING, \
72     VIR_MIGRATE_PARAM_MIGRATE_DISKS,    VIR_TYPED_PARAM_STRING | \
73                                         VIR_TYPED_PARAM_MULTIPLE, \
74     VIR_MIGRATE_PARAM_DISKS_PORT,       VIR_TYPED_PARAM_INT, \
75     VIR_MIGRATE_PARAM_COMPRESSION,      VIR_TYPED_PARAM_STRING | \
76                                         VIR_TYPED_PARAM_MULTIPLE, \
77     VIR_MIGRATE_PARAM_COMPRESSION_MT_LEVEL,         VIR_TYPED_PARAM_INT, \
78     VIR_MIGRATE_PARAM_COMPRESSION_MT_THREADS,       VIR_TYPED_PARAM_INT, \
79     VIR_MIGRATE_PARAM_COMPRESSION_MT_DTHREADS,      VIR_TYPED_PARAM_INT, \
80     VIR_MIGRATE_PARAM_COMPRESSION_XBZRLE_CACHE,     VIR_TYPED_PARAM_ULLONG, \
81     VIR_MIGRATE_PARAM_PERSIST_XML,      VIR_TYPED_PARAM_STRING, \
82     VIR_MIGRATE_PARAM_AUTO_CONVERGE_INITIAL,        VIR_TYPED_PARAM_INT, \
83     VIR_MIGRATE_PARAM_AUTO_CONVERGE_INCREMENT,      VIR_TYPED_PARAM_INT, \
84     VIR_MIGRATE_PARAM_BANDWIDTH_POSTCOPY, VIR_TYPED_PARAM_ULLONG, \
85     VIR_MIGRATE_PARAM_PARALLEL_CONNECTIONS, VIR_TYPED_PARAM_INT, \
86     VIR_MIGRATE_PARAM_TLS_DESTINATION, VIR_TYPED_PARAM_STRING, \
87     VIR_MIGRATE_PARAM_DISKS_URI,     VIR_TYPED_PARAM_STRING, \
88     NULL
89 
90 
91 typedef enum {
92     QEMU_MIGRATION_PHASE_NONE = 0,
93     QEMU_MIGRATION_PHASE_PERFORM2,
94     QEMU_MIGRATION_PHASE_BEGIN3,
95     QEMU_MIGRATION_PHASE_PERFORM3,
96     QEMU_MIGRATION_PHASE_PERFORM3_DONE,
97     QEMU_MIGRATION_PHASE_CONFIRM3_CANCELLED,
98     QEMU_MIGRATION_PHASE_CONFIRM3,
99     QEMU_MIGRATION_PHASE_PREPARE,
100     QEMU_MIGRATION_PHASE_FINISH2,
101     QEMU_MIGRATION_PHASE_FINISH3,
102 
103     QEMU_MIGRATION_PHASE_LAST
104 } qemuMigrationJobPhase;
105 VIR_ENUM_DECL(qemuMigrationJobPhase);
106 
107 char *
108 qemuMigrationSrcBegin(virConnectPtr conn,
109                       virDomainObj *vm,
110                       const char *xmlin,
111                       const char *dname,
112                       char **cookieout,
113                       int *cookieoutlen,
114                       size_t nmigrate_disks,
115                       const char **migrate_disks,
116                       unsigned long flags);
117 
118 virDomainDef *
119 qemuMigrationAnyPrepareDef(virQEMUDriver *driver,
120                            virQEMUCaps *qemuCaps,
121                            const char *dom_xml,
122                            const char *dname,
123                            char **origname);
124 
125 int
126 qemuMigrationDstPrepareTunnel(virQEMUDriver *driver,
127                               virConnectPtr dconn,
128                               const char *cookiein,
129                               int cookieinlen,
130                               char **cookieout,
131                               int *cookieoutlen,
132                               virStreamPtr st,
133                               virDomainDef **def,
134                               const char *origname,
135                               qemuMigrationParams *migParams,
136                               unsigned long flags);
137 
138 int
139 qemuMigrationDstPrepareDirect(virQEMUDriver *driver,
140                               virConnectPtr dconn,
141                               const char *cookiein,
142                               int cookieinlen,
143                               char **cookieout,
144                               int *cookieoutlen,
145                               const char *uri_in,
146                               char **uri_out,
147                               virDomainDef **def,
148                               const char *origname,
149                               const char *listenAddress,
150                               size_t nmigrate_disks,
151                               const char **migrate_disks,
152                               int nbdPort,
153                               const char *nbdURI,
154                               qemuMigrationParams *migParams,
155                               unsigned long flags);
156 
157 int
158 qemuMigrationSrcPerform(virQEMUDriver *driver,
159                         virConnectPtr conn,
160                         virDomainObj *vm,
161                         const char *xmlin,
162                         const char *persist_xml,
163                         const char *dconnuri,
164                         const char *uri,
165                         const char *graphicsuri,
166                         const char *listenAddress,
167                         size_t nmigrate_disks,
168                         const char **migrate_disks,
169                         int nbdPort,
170                         const char *nbdURI,
171                         qemuMigrationParams *migParams,
172                         const char *cookiein,
173                         int cookieinlen,
174                         char **cookieout,
175                         int *cookieoutlen,
176                         unsigned long flags,
177                         const char *dname,
178                         unsigned long resource,
179                         bool v3proto);
180 
181 virDomainPtr
182 qemuMigrationDstFinish(virQEMUDriver *driver,
183                        virConnectPtr dconn,
184                        virDomainObj *vm,
185                        const char *cookiein,
186                        int cookieinlen,
187                        char **cookieout,
188                        int *cookieoutlen,
189                        unsigned long flags,
190                        int retcode,
191                        bool v3proto);
192 
193 int
194 qemuMigrationSrcConfirm(virQEMUDriver *driver,
195                         virDomainObj *vm,
196                         const char *cookiein,
197                         int cookieinlen,
198                         unsigned int flags,
199                         int cancelled);
200 
201 bool
202 qemuMigrationSrcIsAllowed(virQEMUDriver *driver,
203                           virDomainObj *vm,
204                           bool remote,
205                           unsigned int flags);
206 
207 int
208 qemuMigrationSrcToFile(virQEMUDriver *driver,
209                        virDomainObj *vm,
210                        int fd,
211                        virCommand *compressor,
212                        qemuDomainAsyncJob asyncJob)
213     ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) G_GNUC_WARN_UNUSED_RESULT;
214 
215 int
216 qemuMigrationSrcCancel(virQEMUDriver *driver,
217                        virDomainObj *vm);
218 
219 int
220 qemuMigrationAnyFetchStats(virQEMUDriver *driver,
221                            virDomainObj *vm,
222                            qemuDomainAsyncJob asyncJob,
223                            qemuDomainJobInfo *jobInfo,
224                            char **error);
225 
226 int
227 qemuMigrationDstErrorInit(virQEMUDriver *driver);
228 
229 void
230 qemuMigrationDstErrorSave(virQEMUDriver *driver,
231                           const char *name,
232                           virErrorPtr err);
233 
234 void
235 qemuMigrationDstErrorReport(virQEMUDriver *driver,
236                             const char *name);
237 
238 int
239 qemuMigrationDstCheckProtocol(virQEMUCaps *qemuCaps,
240                               const char *migrateFrom);
241 
242 char *
243 qemuMigrationDstGetURI(const char *migrateFrom,
244                        int migrateFd);
245 
246 int
247 qemuMigrationDstRun(virQEMUDriver *driver,
248                     virDomainObj *vm,
249                     const char *uri,
250                     qemuDomainAsyncJob asyncJob);
251 
252 void
253 qemuMigrationAnyPostcopyFailed(virQEMUDriver *driver,
254                             virDomainObj *vm);
255 
256 int
257 qemuMigrationSrcFetchMirrorStats(virQEMUDriver *driver,
258                                  virDomainObj *vm,
259                                  qemuDomainAsyncJob asyncJob,
260                                  qemuDomainJobInfo *jobInfo);
261