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