├── .bettercodehub.yml ├── CHANGES.rst ├── README.rst ├── TODO.rst ├── artwork ├── LICENSE.CC.BY-NC-SA.4-0.source ├── LICENSE.CC.BY-NC-SA.4-0.txt ├── README.rst └── proxmove-logo │ ├── horizontal_black-neutral.png │ ├── horizontal_black-neutral.svg │ ├── horizontal_black-osso.png │ ├── horizontal_black-osso.svg │ ├── horizontal_color-neutral.png │ ├── horizontal_color-neutral.svg │ ├── horizontal_color-osso.png │ ├── horizontal_color-osso.svg │ ├── horizontal_white-neutral.png │ ├── horizontal_white-neutral.svg │ ├── horizontal_white-osso.png │ ├── horizontal_white-osso.svg │ ├── icon_black-neutral.png │ ├── icon_black-neutral.svg │ ├── icon_black-osso.png │ ├── icon_black-osso.svg │ ├── icon_color-neutral.png │ ├── icon_color-neutral.svg │ ├── icon_color-osso.png │ ├── icon_color-osso.svg │ ├── icon_white-neutral.png │ ├── icon_white-neutral.svg │ ├── icon_white-osso.png │ ├── icon_white-osso.svg │ ├── vertical_black-neutral.png │ ├── vertical_black-neutral.svg │ ├── vertical_black-osso.png │ ├── vertical_black-osso.svg │ ├── vertical_color-neutral.png │ ├── vertical_color-neutral.svg │ ├── vertical_color-osso.png │ ├── vertical_color-osso.svg │ ├── vertical_white-neutral.png │ ├── vertical_white-neutral.svg │ ├── vertical_white-osso.png │ └── vertical_white-osso.svg ├── assets └── proxmove_head.png ├── proxmove ├── proxmoverc.sample ├── requirements.txt └── setup.py /.bettercodehub.yml: -------------------------------------------------------------------------------- 1 | # https://bettercodehub.com 2 | 3 | # Search for project directories in the root dir (level 1). 4 | component_depth: 1 5 | 6 | languages: 7 | - name: python 8 | 9 | production: 10 | include: 11 | # The CLI app lacks extension. 12 | - /proxmove 13 | exclude: 14 | - /setup.py 15 | -------------------------------------------------------------------------------- /CHANGES.rst: -------------------------------------------------------------------------------- 1 | Changes 2 | ------- 3 | 4 | * **HEAD** - XXXX-XX-XX 5 | 6 | * **1.2** - 2022-09-21 7 | 8 | Changes: 9 | 10 | - Add ZFS snapshot migration for minimal downtime: full sync, poweroff, 11 | final sync, poweron. 12 | - Add --wait-before-stop to allow manual actions after initial sync. 13 | - Add discard=on on ZFS volumes by default. 14 | - Prefer rsync over scp. 15 | - Add ssh_cipher setting (for AES speedup) for zfs-to-zfs transfers. 16 | - Add workaround to fix boot order on 6.1+6.3 mixed clusters 17 | - Show --average-rate in pv(1) viewer. 18 | 19 | Tweaks/fixes: 20 | 21 | - Create temp dir automatically, instead of complaining. 22 | - Set onboot=0 on old-VM after migration so it does not auto-start. 23 | - Improve various pre-copy checks. 24 | - Fix confusing double exception, fix various other minor annoyances. 25 | - Better ssh handling (accept fingerprints, forwarding only when necessary). 26 | - Better handling of unsupported LXC. 27 | - Also copy the source pool membership to the destination. 28 | 29 | * **1.1** - 2021-06-11 30 | 31 | Features/fixes: 32 | 33 | - Add basic resume support. 34 | - Allow ``:port`` in ``ssh=user@host:port`` config. 35 | - Unmount cdrom media before moving. 36 | - Fix destination volume naming (use ``vm-NNN-disk-N`` instead of 37 | ``vm-NNN-virtioN``). 38 | - Some documentation improvements. 39 | 40 | * **1.0** - 2020-01-17 41 | 42 | Features/fixes: 43 | 44 | - Fix disk I/O resource hog overuse on newer PVE clusters. 45 | - Fix API connection to newer PVE clusters. 46 | - Add faster ssh cipher by default. 47 | - Work around Proxmox API timeout. 48 | - Improved usability through better logging and prepare checks. 49 | 50 | * **0.1.0** - 2018-11-22 51 | 52 | Bugs fixed: 53 | 54 | - Show that not seeing a VM is probably a PVEAdmin-permissions issue. 55 | - Don't die if image_size cannot be determined. 56 | - Place the sample files and docs in a /usr/share/...proxmove subdir. 57 | 58 | * **0.0.9** - 2017-03-28 59 | 60 | New features: 61 | 62 | - Added --no-verify-ssl option. 63 | 64 | Bugs fixed: 65 | 66 | - Fix str-cast bug with ZFS destination creation. 67 | - Fix ignoring of non-volume properties like "scsihw". 68 | 69 | * **0.0.8** - 2017-01-26 70 | 71 | New features: 72 | 73 | - Partial LXC container move implemented. Not complete. 74 | 75 | Bugs fixed: 76 | 77 | - Allow ZFS paths to be more than just the a pool name. Instead of 78 | e.g. ``path=zfs:mc9-8-ssd`` we now also allow 79 | ``path=zfs:rpool/data/images``. Closes #7. 80 | 81 | * **v0.0.7** - 2016-10-07 82 | 83 | Bugs fixed: 84 | 85 | - Instead of trusting on the "size=XXG" which may or may not be 86 | present in the storage volume config, it reads the QCOW header or 87 | ZFS volume size directly. Also checks that the values are available 88 | before attempting a move. 89 | 90 | * **v0.0.6** - 2016-09-21 91 | 92 | New features: 93 | 94 | - Add --bwlimit in Mbit/s to limit bandwidth during transfer. Will use 95 | the scp(1) -l option or for ZFS use the mbuffer(1) auxiliary. As an 96 | added bonus mbuffer may improve ZFS send/recv speed through 97 | buffering. Closes #4. 98 | - Add --skip-disks option to skip copying of the disks. Use this if 99 | you want to copy the disks manually. Closes #3. 100 | - Add --skip-start option to skip autostarting of the VM. 101 | - Adds optional pv(1) pipe viewer progress bar to get ETA in ZFS 102 | transfers. 103 | - Add hidden --debug option for more verbosity. 104 | - Add hidden --ignore-exists option that allows you to test moves 105 | between the same cluster by creating an alias (second config). 106 | 107 | Bugs fixed: 108 | 109 | - Format is not always specified in the properties. If it isn't, use 110 | the image filename suffix when available. 111 | - Sometimes old values aren't available in the "pending" list. Don't croak. 112 | Closes #2. 113 | - Begun refactoring. Testing bettercodehub.com. 114 | - Also check whether temporary (renamed) VMs exist before starting. 115 | 116 | * **v0.0.5** - 2016-08-30 117 | 118 | - Added support for ZFS to ZFS disk copy. QCOW2 to ZFS and ZFS to ZFS 119 | is now tested. 120 | 121 | * **v0.0.4** - 2016-08-30 122 | 123 | - Major overhaul of configuration format and other changes. 124 | -------------------------------------------------------------------------------- /README.rst: -------------------------------------------------------------------------------- 1 | |proxmove| 2 | ========== 3 | 4 | *The Proxmox VM migrator: migrates VMs between different Proxmox VE clusters.* 5 | 6 | Migrating a virtual machine (VM) on a PVE-cluster from one node to 7 | another is implemented in the Proxmox Virtual Environment (PVE). But 8 | migrating a VM from one PVE-cluster to another is not. 9 | 10 | proxmove helps you move VMs between PVE-clusters with minimal hassle. 11 | *And if you use ZFS, with minimal downtime too.* 12 | 13 | 14 | Example invocation: 15 | 16 | .. code-block:: console 17 | 18 | $ proxmove SOURCE_CLUSTER DEST_CLUSTER DEST_NODE DEST_STORAGE VM_NAME1... 19 | 20 | But, to get it to work, you'll need to configure ``~/.proxmoverc`` 21 | first. See `Configuration`_. 22 | 23 | 24 | Additional tips: 25 | 26 | - If source and destination filesystems use ZFS, the move is done in two 27 | stages, by copying an initial snapshot while the source VM is still 28 | up. Combine with ``--wait-before-stop`` for additional control. 29 | - Use ``--debug``; it doesn't flood your screen, but provides useful clues 30 | about what it's doing. 31 | - If your network bridge is different on the ``DEST_CLUSTER``, use 32 | ``--skip-start``; that way *proxmove* "completes" successfully when 33 | done with the move. (You'll still need to change the bridge before 34 | starting the VM obviously.) 35 | - If *proxmove* detects that a move was in progress, it will 36 | interactively attempt a resume. For ZFS to ZFS syncs, it will do 37 | *another* initial resync before shutting down the source VM. 38 | 39 | 40 | Full invocation specification (``--help``): 41 | 42 | .. code-block:: 43 | 44 | usage: proxmove [-c FILENAME] [-n] [--bwlimit MBPS] [--no-verify-ssl] 45 | [--skip-disks] [--skip-start] [--wait-before-stop] 46 | [--ssh-ciphers CIPHERS] [--debug] [--ignore-exists] 47 | [-h] [--version] 48 | source destination nodeid storage vm [vm ...] 49 | 50 | Migrate VMs from one Proxmox cluster to another. 51 | 52 | positional arguments: 53 | source alias of source cluster 54 | destination alias of destination cluster 55 | nodeid node on destination cluster 56 | storage storage on destination node 57 | vm one or more VMs (guests) to move 58 | 59 | optional arguments: 60 | -c FILENAME, --config FILENAME 61 | use alternate configuration inifile 62 | -n, --dry-run stop before doing any writes 63 | --bwlimit MBPS limit bandwidth in Mbit/s 64 | --no-verify-ssl skip ssl verification on the api hosts 65 | --skip-disks do the move, but skip copying of the disks; 66 | implies --skip-start 67 | --skip-start do the move, but do not start the new instance 68 | --wait-before-stop prepare the move, but ask for user 69 | confirmation before shutting down the old 70 | instance (useful if you have to move 71 | networks/IPs) 72 | --ssh-ciphers CIPHERS 73 | comma separated list of ssh -c ciphers to 74 | prefer, (aes128-gcm@openssh.com is supposed to 75 | be fast if you have aes on your cpu); set to 76 | "-" to use ssh defaults 77 | 78 | debug arguments: 79 | --debug enables extra debug logging 80 | --ignore-exists continue when target VM already exists; allows 81 | moving to same cluster 82 | 83 | other actions: 84 | -h, --help show this help message and exit 85 | --version show program's version number and exit 86 | 87 | Cluster aliases and storage locations should be defined in 88 | ~/.proxmoverc (or see -c option). See the example proxmoverc.sample. 89 | It requires [pve:CLUSTER_ALIAS] sections for the proxmox "api" URL and 90 | [storage:CLUSTER_ALIAS:STORAGE_NAME] sections with "ssh", "path" and 91 | "temp" settings. 92 | 93 | 94 | Example run 95 | ----------- 96 | 97 | First you need to configure ``~/.proxmoverc``; see below. 98 | 99 | When configured, you can do something like this: 100 | 101 | .. code-block:: console 102 | 103 | $ proxmove apple-cluster banana-cluster node2 node2-ssd the-vm-to-move 104 | 12:12:27: Attempt moving apple-cluster => banana-cluster<6669ad2c> (node 'node2'): the-vm-to-move 105 | 12:12:27: - source VM the-vm-to-move@node1 106 | 12:12:27: - storage 'ide2': None,media=cdrom (host=, guest=) 107 | 12:12:27: - storage 'virtio0': sharedsan:565/vm-565-disk-1.qcow2,format=qcow2,iops_rd=4000,iops_wr=500,size=50G (host=37.7GiB, guest=50.0GiB) 108 | 12:12:27: Creating new VM 'the-vm-to-move' on 'banana-cluster', node 'node2' 109 | 12:12:27: - created new VM 'the-vm-to-move--CREATING' as UPID:node2:00005977:1F4D78F4:57C55C0B:qmcreate:126:user@pve:; waiting for it to show up 110 | 12:12:34: - created new VM 'the-vm-to-move--CREATING': the-vm-to-move--CREATING@node2 111 | 12:12:34: Stopping VM the-vm-to-move@node1 112 | 12:12:42: - stopped VM the-vm-to-move@node1 113 | 12:12:42: Ejected (cdrom?) volume 'ide2' (none) added to the-vm-to-move--CREATING@node2 114 | 12:12:42: Begin copy of 'virtio0' (sharedsan:565/vm-565-disk-1.qcow2,format=qcow2,iops_rd=4000,iops_wr=500,size=50G) to local-ssd 115 | 12:12:42: scp(1) copy from '/pool0/san/images/565/vm-565-disk-1.qcow2' (on sharedsan) to 'root@node2.banana-cluster.com:/node2-ssd/temp/temp-proxmove/vm-126-virtio0' 116 | Warning: Permanently added 'node2.banana-cluster.com' (ECDSA) to the list of known hosts. 117 | vm-565-disk-1.qcow2 100% 50GB 90.5MB/s 09:26 118 | Connection to san.apple-cluster.com closed. 119 | 12:22:08: Temp data '/node2-ssd/temp/temp-proxmove/vm-126-virtio0' on local-ssd 120 | 12:22:08: Writing data from temp '/node2-ssd/temp/temp-proxmove/vm-126-virtio0' to '/dev/zvol/node2-ssd/vm-126-virtio0' (on local-ssd) 121 | (100.00/100%) 122 | Connection to node2.banana-cluster.com closed. 123 | 12:24:25: Removing temp '/node2-ssd/temp/temp-proxmove/vm-126-virtio0' (on local-ssd) 124 | 12:24:26: Starting VM the-vm-to-move@node2 125 | 12:24:27: - started VM the-vm-to-move@node2 126 | 12:24:27: Completed moving apple-cluster => banana-cluster<6669ad2c> (node 'node2'): the-vm-to-move 127 | 128 | Before, ``the-vm-to-move`` was running on ``apple-cluster`` on ``node1``. 129 | 130 | Afterwards, ``the-vm-to-move`` is running on ``banana-cluster`` on ``node2``. 131 | The ``the-vm-to-move`` on the ``apple-cluster`` has been stopped and renamed to 132 | ``the-vm-to-move--MIGRATED``. 133 | 134 | 135 | Configuration 136 | ------------- 137 | 138 | Set up the ``~/.proxmoverc`` config file. First you need to define which 139 | clusters you have. For example *apple-cluster* and *banana-cluster*. 140 | 141 | .. code-block:: ini 142 | 143 | ; Example cluster named "apple-cluster" with 3 storage devices, one 144 | ; shared, and two which exist on a single node only. 145 | ; 146 | ; The user requires various permissions found in the PVEVMAdmin role (VM 147 | ; allocate + audit) and PVEAuditor role (Datastore audit) and PVEPoolAdmin 148 | ; (to inspect and create pools). And PVESDNAdmin role for the network conf. 149 | ; 150 | [pve:apple-cluster] 151 | api=https://user@pve:PASSWORD@apple-cluster.com:443 152 | 153 | ; Example cluster named "banana-cluster" with 2 storage devices; both 154 | ; storage devices exist on the respective nodes only. 155 | [pve:banana-cluster] 156 | api=https://user@pve:PASSWORD@banana-cluster.com:443 157 | 158 | Next, it needs configuration for the storage devices. They are expected 159 | to be reachable over SSH; both from the caller and from each other 160 | (using SSH-agent forwarding). 161 | 162 | The following defines two storage devices for the *apple-cluster*, one shared 163 | and one local to *node1* only. 164 | 165 | If on *sharedsan*, the images are probably called something like 166 | ``/pool0/san/images/VMID/vm-VMID-disk1.qcow2``, while in Proxmox, they are 167 | referred to as ``sharedsan:VMID/vm-VMID-disk1.qcow2``. 168 | 169 | .. code-block:: ini 170 | 171 | [storage:apple-cluster:sharedsan] ; "sharedsan" is available on all nodes 172 | ssh=root@san.apple-cluster.com 173 | path=/pool0/san/images 174 | temp=/pool0/san/private 175 | 176 | [storage:apple-cluster:local@node1] ; local disk on node1 only 177 | ssh=root@node1.apple-cluster.com 178 | path=/srv/images 179 | temp=/srv/temp 180 | 181 | If you use ZFS storage on *banana-cluster*, the storage config could look 182 | like this. Disk volumes exist on the ZFS filesystem ``node1-ssd/images`` 183 | and ``node2-ssd/images`` on the nodes *node1* and *node2* respectively. 184 | 185 | Note that the ``temp=`` path is always a regular path. 186 | 187 | .. code-block:: ini 188 | 189 | [storage:banana-cluster:node1-ssd@node1] 190 | ssh=root@node1.banana-cluster.com 191 | path=zfs:node1-ssd/images 192 | temp=/node1-ssd/temp 193 | 194 | [storage:banana-cluster:node2-ssd@node2] 195 | ssh=root@node2.banana-cluster.com 196 | path=zfs:node2-ssd/images 197 | temp=/node2-ssd/temp 198 | 199 | The config file looks better with indentation. The author suggests this layout: 200 | 201 | .. code-block:: ini 202 | 203 | [pve:apple-cluster] 204 | ... 205 | 206 | [storage:apple-cluster:sharedsan] 207 | ... 208 | [storage:apple-cluster:local@node1] 209 | ... 210 | 211 | [pve:banana-cluster] 212 | ... 213 | 214 | [storage:banana-cluster:node1-ssd@node1] 215 | ... 216 | 217 | 218 | Debugging 219 | --------- 220 | 221 | If you run into a ``ResourceException``, you may want to patch proxmoxer 1.0.3 222 | to show the HTTP error reason as well. 223 | 224 | .. code-block:: udiff 225 | 226 | --- proxmoxer/core.py 2019-04-04 09:13:16.832961589 +0200 227 | +++ proxmoxer/core.py 2019-04-04 09:15:45.434175030 +0200 228 | @@ -75,8 +75,10 @@ class ProxmoxResource(ProxmoxResourceBas 229 | logger.debug('Status code: %s, output: %s', resp.status_code, resp.content) 230 | 231 | if resp.status_code >= 400: 232 | - raise ResourceException("{0} {1}: {2}".format(resp.status_code, httplib.responses[resp.status_code], 233 | - resp.content)) 234 | + raise ResourceException('{0} {1} ("{2}"): {3}'.format( 235 | + resp.status_code, httplib.responses[resp.status_code], 236 | + resp.reason, # reason = textual status_code 237 | + resp.content)) 238 | elif 200 <= resp.status_code <= 299: 239 | return self._store["serializer"].loads(resp) 240 | 241 | It might reveal a bug (or new feature), like:: 242 | 243 | proxmoxer.core.ResourceException: 244 | 500 Internal Server Error ("only root can set 'vmgenid' config"): 245 | b'{"data":null}' 246 | 247 | 248 | License 249 | ------- 250 | 251 | proxmove is free software: you can redistribute it and/or modify it under 252 | the terms of the GNU General Public License as published by the Free 253 | Software Foundation, version 3 or any later version. 254 | 255 | 256 | .. |proxmove| image:: assets/proxmove_head.png 257 | :alt: proxmove 258 | -------------------------------------------------------------------------------- /TODO.rst: -------------------------------------------------------------------------------- 1 | TODO 2 | ---- 3 | 4 | * On missing disk (bad config), the zfs send stalls and mbuffer waits for 5 | infinity. 6 | 7 | * Rename "VM" to "Instance" so "LXC" containers don't feel misrepresented. 8 | 9 | * Communicate with the storage API to check/configure storage (more easily). 10 | 11 | * Create a ``--config`` command to set up a basic configuration. Combine with 12 | storage API reading. 13 | 14 | * Fix so LXC-copying works (this is a bit tricky because of the necessity for 15 | a temporary image/tarball to install). 16 | 17 | * Create a proxmoxer_api example that returns test data, so we can run tests. 18 | 19 | * Let it work with pve-zsync -- a daemon that syncs data between nodes: 20 | https://pve.proxmox.com/wiki/PVE-zsync 21 | -------------------------------------------------------------------------------- /artwork/LICENSE.CC.BY-NC-SA.4-0.source: -------------------------------------------------------------------------------- 1 | https://creativecommons.org/licenses/by-nc-sa/4.0/legalcode.txt 2 | -------------------------------------------------------------------------------- /artwork/README.rst: -------------------------------------------------------------------------------- 1 | proxmove artwork 2 | ================ 3 | 4 | The artwork -- the proxmove logo, created by Ura Design (@uracreative) -- 5 | is licensed according to the 6 | *Attribution-NonCommercial-ShareAlike 4.0 International* Creative Commons 7 | license (CC BY-NC-SA 4.0); 8 | see `LICENSE.CC.BY-NC-SA.4-0.txt 9 | `_. 10 | -------------------------------------------------------------------------------- /artwork/proxmove-logo/horizontal_black-neutral.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ossobv/proxmove/c74aae7627880597360dece914510f670ece7814/artwork/proxmove-logo/horizontal_black-neutral.png -------------------------------------------------------------------------------- /artwork/proxmove-logo/horizontal_black-neutral.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 22 | 24 | 52 | 57 | 58 | 60 | 61 | 63 | image/svg+xml 64 | 66 | 67 | 68 | 69 | 70 | 75 | 79 | 83 | 88 | 89 | 93 | 98 | 99 | 103 | 108 | 109 | 113 | 118 | 119 | 123 | 128 | 129 | 133 | 138 | 139 | 143 | 148 | 149 | 153 | 158 | 159 | 163 | 168 | 169 | 173 | 178 | 179 | 183 | 188 | 189 | 193 | 198 | 199 | 203 | 208 | 209 | 213 | 218 | 219 | 220 | 221 | 222 | -------------------------------------------------------------------------------- /artwork/proxmove-logo/horizontal_black-osso.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ossobv/proxmove/c74aae7627880597360dece914510f670ece7814/artwork/proxmove-logo/horizontal_black-osso.png -------------------------------------------------------------------------------- /artwork/proxmove-logo/horizontal_black-osso.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 22 | 24 | 52 | 57 | 58 | 60 | 61 | 63 | image/svg+xml 64 | 66 | 67 | 68 | 69 | 70 | 75 | 79 | 83 | 88 | 89 | 93 | 98 | 99 | 103 | 108 | 109 | 113 | 118 | 119 | 123 | 128 | 129 | 133 | 138 | 139 | 143 | 148 | 149 | 153 | 158 | 159 | 163 | 168 | 169 | 173 | 178 | 179 | 183 | 188 | 189 | 193 | 198 | 199 | 203 | 208 | 209 | 213 | 218 | 219 | 220 | 221 | 222 | -------------------------------------------------------------------------------- /artwork/proxmove-logo/horizontal_color-neutral.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ossobv/proxmove/c74aae7627880597360dece914510f670ece7814/artwork/proxmove-logo/horizontal_color-neutral.png -------------------------------------------------------------------------------- /artwork/proxmove-logo/horizontal_color-neutral.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 22 | 24 | 52 | 57 | 58 | 60 | 61 | 63 | image/svg+xml 64 | 66 | 67 | 68 | 69 | 70 | 75 | 78 | 81 | 86 | 87 | 90 | 95 | 96 | 99 | 104 | 105 | 108 | 113 | 114 | 117 | 122 | 123 | 126 | 131 | 132 | 135 | 140 | 141 | 144 | 149 | 150 | 153 | 158 | 159 | 162 | 167 | 168 | 171 | 176 | 177 | 180 | 185 | 186 | 189 | 194 | 195 | 198 | 203 | 204 | 205 | 206 | 207 | -------------------------------------------------------------------------------- /artwork/proxmove-logo/horizontal_color-osso.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ossobv/proxmove/c74aae7627880597360dece914510f670ece7814/artwork/proxmove-logo/horizontal_color-osso.png -------------------------------------------------------------------------------- /artwork/proxmove-logo/horizontal_color-osso.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 19 | 21 | 49 | 54 | 55 | 57 | 58 | 60 | image/svg+xml 61 | 63 | 64 | 65 | 66 | 67 | 72 | 75 | 78 | 83 | 84 | 87 | 92 | 93 | 96 | 101 | 102 | 105 | 110 | 111 | 114 | 119 | 120 | 123 | 128 | 129 | 133 | 138 | 139 | 143 | 148 | 149 | 153 | 158 | 159 | 163 | 168 | 169 | 173 | 178 | 179 | 183 | 188 | 189 | 193 | 198 | 199 | 203 | 208 | 209 | 210 | 211 | 212 | -------------------------------------------------------------------------------- /artwork/proxmove-logo/horizontal_white-neutral.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ossobv/proxmove/c74aae7627880597360dece914510f670ece7814/artwork/proxmove-logo/horizontal_white-neutral.png -------------------------------------------------------------------------------- /artwork/proxmove-logo/horizontal_white-neutral.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 22 | 24 | 52 | 57 | 58 | 60 | 61 | 63 | image/svg+xml 64 | 66 | 67 | 68 | 69 | 70 | 75 | 79 | 83 | 88 | 89 | 93 | 98 | 99 | 103 | 108 | 109 | 113 | 118 | 119 | 123 | 128 | 129 | 133 | 138 | 139 | 143 | 148 | 149 | 153 | 158 | 159 | 163 | 168 | 169 | 173 | 178 | 179 | 183 | 188 | 189 | 193 | 198 | 199 | 203 | 208 | 209 | 213 | 218 | 219 | 220 | 221 | 222 | -------------------------------------------------------------------------------- /artwork/proxmove-logo/horizontal_white-osso.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ossobv/proxmove/c74aae7627880597360dece914510f670ece7814/artwork/proxmove-logo/horizontal_white-osso.png -------------------------------------------------------------------------------- /artwork/proxmove-logo/horizontal_white-osso.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 22 | 24 | 52 | 57 | 58 | 60 | 61 | 63 | image/svg+xml 64 | 66 | 67 | 68 | 69 | 70 | 75 | 79 | 83 | 88 | 89 | 93 | 98 | 99 | 103 | 108 | 109 | 113 | 118 | 119 | 123 | 128 | 129 | 133 | 138 | 139 | 143 | 148 | 149 | 153 | 158 | 159 | 163 | 168 | 169 | 173 | 178 | 179 | 183 | 188 | 189 | 193 | 198 | 199 | 203 | 208 | 209 | 213 | 218 | 219 | 220 | 221 | 222 | -------------------------------------------------------------------------------- /artwork/proxmove-logo/icon_black-neutral.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ossobv/proxmove/c74aae7627880597360dece914510f670ece7814/artwork/proxmove-logo/icon_black-neutral.png -------------------------------------------------------------------------------- /artwork/proxmove-logo/icon_black-neutral.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 22 | 24 | 52 | 57 | 58 | 60 | 61 | 63 | image/svg+xml 64 | 66 | 67 | 68 | 69 | 70 | 75 | 79 | 83 | 88 | 89 | 93 | 98 | 99 | 103 | 108 | 109 | 113 | 118 | 119 | 123 | 128 | 129 | 133 | 138 | 139 | 140 | 141 | 142 | -------------------------------------------------------------------------------- /artwork/proxmove-logo/icon_black-osso.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ossobv/proxmove/c74aae7627880597360dece914510f670ece7814/artwork/proxmove-logo/icon_black-osso.png -------------------------------------------------------------------------------- /artwork/proxmove-logo/icon_black-osso.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 22 | 24 | 52 | 57 | 58 | 60 | 61 | 63 | image/svg+xml 64 | 66 | 67 | 68 | 69 | 70 | 75 | 79 | 83 | 88 | 89 | 93 | 98 | 99 | 103 | 108 | 109 | 113 | 118 | 119 | 123 | 128 | 129 | 133 | 138 | 139 | 140 | 141 | 142 | -------------------------------------------------------------------------------- /artwork/proxmove-logo/icon_color-neutral.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ossobv/proxmove/c74aae7627880597360dece914510f670ece7814/artwork/proxmove-logo/icon_color-neutral.png -------------------------------------------------------------------------------- /artwork/proxmove-logo/icon_color-neutral.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 22 | 24 | 52 | 57 | 58 | 60 | 61 | 63 | image/svg+xml 64 | 66 | 67 | 68 | 69 | 70 | 75 | 78 | 81 | 86 | 87 | 90 | 95 | 96 | 99 | 104 | 105 | 108 | 113 | 114 | 117 | 122 | 123 | 126 | 131 | 132 | 133 | 134 | 135 | -------------------------------------------------------------------------------- /artwork/proxmove-logo/icon_color-osso.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ossobv/proxmove/c74aae7627880597360dece914510f670ece7814/artwork/proxmove-logo/icon_color-osso.png -------------------------------------------------------------------------------- /artwork/proxmove-logo/icon_color-osso.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 22 | 24 | 52 | 57 | 58 | 60 | 61 | 63 | image/svg+xml 64 | 66 | 67 | 68 | 69 | 70 | 75 | 78 | 81 | 86 | 87 | 90 | 95 | 96 | 99 | 104 | 105 | 108 | 113 | 114 | 117 | 122 | 123 | 126 | 131 | 132 | 133 | 134 | 135 | -------------------------------------------------------------------------------- /artwork/proxmove-logo/icon_white-neutral.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ossobv/proxmove/c74aae7627880597360dece914510f670ece7814/artwork/proxmove-logo/icon_white-neutral.png -------------------------------------------------------------------------------- /artwork/proxmove-logo/icon_white-neutral.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 22 | 24 | 52 | 57 | 58 | 60 | 61 | 63 | image/svg+xml 64 | 66 | 67 | 68 | 69 | 70 | 75 | 79 | 83 | 88 | 89 | 93 | 98 | 99 | 103 | 108 | 109 | 113 | 118 | 119 | 123 | 128 | 129 | 133 | 138 | 139 | 140 | 141 | 142 | -------------------------------------------------------------------------------- /artwork/proxmove-logo/icon_white-osso.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ossobv/proxmove/c74aae7627880597360dece914510f670ece7814/artwork/proxmove-logo/icon_white-osso.png -------------------------------------------------------------------------------- /artwork/proxmove-logo/icon_white-osso.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 22 | 24 | 52 | 57 | 58 | 60 | 61 | 63 | image/svg+xml 64 | 66 | 67 | 68 | 69 | 70 | 75 | 79 | 83 | 88 | 89 | 93 | 98 | 99 | 103 | 108 | 109 | 113 | 118 | 119 | 123 | 128 | 129 | 133 | 138 | 139 | 140 | 141 | 142 | -------------------------------------------------------------------------------- /artwork/proxmove-logo/vertical_black-neutral.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ossobv/proxmove/c74aae7627880597360dece914510f670ece7814/artwork/proxmove-logo/vertical_black-neutral.png -------------------------------------------------------------------------------- /artwork/proxmove-logo/vertical_black-neutral.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 22 | 24 | 52 | 57 | 58 | 60 | 61 | 63 | image/svg+xml 64 | 66 | 67 | 68 | 69 | 70 | 75 | 79 | 83 | 88 | 89 | 93 | 98 | 99 | 103 | 108 | 109 | 113 | 118 | 119 | 123 | 128 | 129 | 133 | 138 | 139 | 143 | 148 | 149 | 153 | 158 | 159 | 163 | 168 | 169 | 173 | 178 | 179 | 183 | 188 | 189 | 193 | 198 | 199 | 203 | 208 | 209 | 213 | 218 | 219 | 220 | 221 | 222 | -------------------------------------------------------------------------------- /artwork/proxmove-logo/vertical_black-osso.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ossobv/proxmove/c74aae7627880597360dece914510f670ece7814/artwork/proxmove-logo/vertical_black-osso.png -------------------------------------------------------------------------------- /artwork/proxmove-logo/vertical_black-osso.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 22 | 24 | 52 | 57 | 58 | 60 | 61 | 63 | image/svg+xml 64 | 66 | 67 | 68 | 69 | 70 | 75 | 79 | 83 | 88 | 89 | 93 | 98 | 99 | 103 | 108 | 109 | 113 | 118 | 119 | 123 | 128 | 129 | 133 | 138 | 139 | 143 | 148 | 149 | 153 | 158 | 159 | 163 | 168 | 169 | 173 | 178 | 179 | 183 | 188 | 189 | 193 | 198 | 199 | 203 | 208 | 209 | 213 | 218 | 219 | 220 | 221 | 222 | -------------------------------------------------------------------------------- /artwork/proxmove-logo/vertical_color-neutral.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ossobv/proxmove/c74aae7627880597360dece914510f670ece7814/artwork/proxmove-logo/vertical_color-neutral.png -------------------------------------------------------------------------------- /artwork/proxmove-logo/vertical_color-neutral.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 22 | 24 | 52 | 57 | 58 | 60 | 61 | 63 | image/svg+xml 64 | 66 | 67 | 68 | 69 | 70 | 75 | 78 | 81 | 86 | 87 | 90 | 95 | 96 | 99 | 104 | 105 | 108 | 113 | 114 | 117 | 122 | 123 | 126 | 131 | 132 | 135 | 140 | 141 | 144 | 149 | 150 | 153 | 158 | 159 | 162 | 167 | 168 | 171 | 176 | 177 | 180 | 185 | 186 | 189 | 194 | 195 | 198 | 203 | 204 | 205 | 206 | 207 | -------------------------------------------------------------------------------- /artwork/proxmove-logo/vertical_color-osso.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ossobv/proxmove/c74aae7627880597360dece914510f670ece7814/artwork/proxmove-logo/vertical_color-osso.png -------------------------------------------------------------------------------- /artwork/proxmove-logo/vertical_color-osso.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 22 | 24 | 52 | 57 | 58 | 60 | 61 | 63 | image/svg+xml 64 | 66 | 67 | 68 | 69 | 70 | 75 | 78 | 81 | 86 | 87 | 90 | 95 | 96 | 99 | 104 | 105 | 108 | 113 | 114 | 117 | 122 | 123 | 126 | 131 | 132 | 136 | 141 | 142 | 146 | 151 | 152 | 156 | 161 | 162 | 166 | 171 | 172 | 176 | 181 | 182 | 186 | 191 | 192 | 196 | 201 | 202 | 205 | 210 | 211 | 212 | 213 | 214 | -------------------------------------------------------------------------------- /artwork/proxmove-logo/vertical_white-neutral.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ossobv/proxmove/c74aae7627880597360dece914510f670ece7814/artwork/proxmove-logo/vertical_white-neutral.png -------------------------------------------------------------------------------- /artwork/proxmove-logo/vertical_white-neutral.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 22 | 24 | 52 | 57 | 58 | 60 | 61 | 63 | image/svg+xml 64 | 66 | 67 | 68 | 69 | 70 | 75 | 79 | 83 | 88 | 89 | 93 | 98 | 99 | 103 | 108 | 109 | 113 | 118 | 119 | 123 | 128 | 129 | 133 | 138 | 139 | 143 | 148 | 149 | 153 | 158 | 159 | 163 | 168 | 169 | 173 | 178 | 179 | 183 | 188 | 189 | 193 | 198 | 199 | 203 | 208 | 209 | 213 | 218 | 219 | 220 | 221 | 222 | -------------------------------------------------------------------------------- /artwork/proxmove-logo/vertical_white-osso.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ossobv/proxmove/c74aae7627880597360dece914510f670ece7814/artwork/proxmove-logo/vertical_white-osso.png -------------------------------------------------------------------------------- /artwork/proxmove-logo/vertical_white-osso.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 22 | 24 | 52 | 57 | 58 | 60 | 61 | 63 | image/svg+xml 64 | 66 | 67 | 68 | 69 | 70 | 75 | 79 | 83 | 88 | 89 | 93 | 98 | 99 | 103 | 108 | 109 | 113 | 118 | 119 | 123 | 128 | 129 | 133 | 138 | 139 | 143 | 148 | 149 | 153 | 158 | 159 | 163 | 168 | 169 | 173 | 178 | 179 | 183 | 188 | 189 | 193 | 198 | 199 | 203 | 208 | 209 | 213 | 218 | 219 | 220 | 221 | 222 | -------------------------------------------------------------------------------- /assets/proxmove_head.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ossobv/proxmove/c74aae7627880597360dece914510f670ece7814/assets/proxmove_head.png -------------------------------------------------------------------------------- /proxmoverc.sample: -------------------------------------------------------------------------------- 1 | ; PVE clusters should to be specified as follows. 2 | ; 3 | ; [pve:CLUSTER_ALIAS] 4 | ; ; The API must be reachable over HTTPS. The USER needs PVEVMAdmin 5 | ; ; powers on '/' in your PVE cluster. 6 | ; api=https://USER@pve:PASSWORD@HOST:PORT 7 | ; 8 | ; The PVE clusters have one or more storage devices that must be 9 | ; reachable over SSH. When moving data between storage devices, the 10 | ; data is first copied to the `temp` location on the destination storage 11 | ; and then converted to the correct format. 12 | ; 13 | ; Every cluster needs at least one storage device. Some may be shared 14 | ; across nodes, others exist on a single node only. 15 | ; 16 | ; If the path is a plain path, file-based images are used. If the path 17 | ; starts with "zfs:", it is considered to be a zfs filesystem path. 18 | ; 19 | ; [storage:CLUSTER_ALIAS:DISK_NAME[@NODE_NAME]] 20 | ; ssh=root@HOST 21 | ; path=/path/to/somewhere ; for plain disk (DISK_NAME:VMID/...), or 22 | ; path=zfs:ZFS_FS_NAME ; for ZFS (DISK_NAME:vm-VMID-disk-1) 23 | 24 | ; Example cluster named "banana-cluster" with 3 storage devices, one 25 | ; shared, and two which exist on a single node only. 26 | [pve:banana-cluster] 27 | api=https://user@pve:PASSWORD@banana-cluster.com:443 28 | 29 | [storage:banana-cluster:sharedsan] ; "sharedsan" is available on all nodes 30 | ssh=root@san.banana-cluster.com 31 | path=/pool0/san/images 32 | temp=/pool0/san/private 33 | 34 | [storage:banana-cluster:local@node1] ; local disk on node1 only 35 | ssh=root@node1.banana-cluster.com 36 | path=/srv/images 37 | temp=/srv/temp 38 | 39 | [storage:banana-cluster:local@node2] ; other local disk on node2 only 40 | ssh=root@node2.banana-cluster.com 41 | path=/srv/images 42 | temp=/srv/temp 43 | 44 | ; Example cluster named "the-new-cluster" with 2 storage devices; both 45 | ; storage devices exist on the respective nodes only. 46 | [pve:the-new-cluster] 47 | api=https://user@pve:PASSWORD@the-new-cluster.com:443 48 | 49 | [storage:the-new-cluster:node1-ssd@node1] 50 | ssh=root@node1.the-new-cluster.com 51 | path=zfs:node1-ssd/images 52 | temp=/node1-ssd/temp 53 | 54 | [storage:the-new-cluster:node2-ssd@node2] 55 | ssh=root@node2.the-new-cluster.com 56 | path=zfs:node2-ssd/images 57 | temp=/node2-ssd/temp 58 | 59 | ; vim: set syn=cfg: 60 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | # mkvirtualenv proxmove --system-site-packages --python=`which python3` 2 | proxmoxer>=0.2.4 3 | -------------------------------------------------------------------------------- /setup.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | from distutils.core import setup 3 | 4 | with open('proxmove') as fp: 5 | for line in fp: 6 | if line.startswith('__version__'): 7 | version = line.split("'")[1] 8 | break 9 | 10 | long_description = [] 11 | for filename in ('README.rst', 'CHANGES.rst', 'TODO.rst'): 12 | with open(filename) as fp: 13 | long_description.append(fp.read()) 14 | long_description = '\n\n'.join(long_description) 15 | 16 | 17 | setup( 18 | name='proxmove', 19 | version=version, 20 | scripts=['proxmove'], 21 | data_files=[ 22 | ('share/doc/proxmove', [ 23 | 'README.rst', 'CHANGES.rst', 'TODO.rst']), 24 | ('share/proxmove', [ 25 | 'proxmoverc.sample'])], 26 | description=( 27 | 'Migrate virtual machines between different Proxmox VM clusters'), 28 | long_description=long_description, 29 | author='Walter Doekes, OSSO B.V.', 30 | author_email='wjdoekes+proxmove@osso.nl', 31 | url='https://github.com/ossobv/proxmove', 32 | license='GPLv3+', 33 | platforms=['linux'], 34 | classifiers=[ 35 | 'Development Status :: 4 - Beta', 36 | 'Intended Audience :: System Administrators', 37 | ('License :: OSI Approved :: GNU General Public License v3 ' 38 | 'or later (GPLv3+)'), 39 | 'Operating System :: POSIX :: Linux', 40 | 'Programming Language :: Python :: 3', 41 | 'Topic :: System :: Clustering', 42 | ], 43 | install_requires=[ 44 | 'proxmoxer>=0.2.4', 45 | 'requests>=2.9.1', 46 | ], 47 | ) 48 | 49 | # vim: set ts=8 sw=4 sts=4 et ai tw=79: 50 | --------------------------------------------------------------------------------