diff --git a/ow_vm_management/models/__pycache__/vps_server.cpython-39.pyc b/ow_vm_management/models/__pycache__/vps_server.cpython-39.pyc index 3e16b15..2f95172 100644 Binary files a/ow_vm_management/models/__pycache__/vps_server.cpython-39.pyc and b/ow_vm_management/models/__pycache__/vps_server.cpython-39.pyc differ diff --git a/ow_vm_management/models/vps_server.py b/ow_vm_management/models/vps_server.py index 7089ba7..ade2aa4 100644 --- a/ow_vm_management/models/vps_server.py +++ b/ow_vm_management/models/vps_server.py @@ -20,6 +20,11 @@ class VPSServer(models.Model): proxmox_server_id = fields.Many2one('proxmox.server', string='Proxmox Server', tracking=True) ct_id = fields.Integer(string='CT ID (LXC)', tracking=True) vm_id = fields.Integer(string='VM ID (QEMU)', tracking=True) + state = fields.Selection([ + ('running', 'Running'), + ('stopped', 'Stopped'), + ('unknown', 'Unknown') + ], string='State', default='unknown', tracking=True) def _compute_access_url(self): super()._compute_access_url() @@ -31,6 +36,61 @@ class VPSServer(models.Model): if self.ct_id and self.vm_id: raise UserError(_("Please provide either CT ID or VM ID, not both.")) + def _proxmox_request(self, method, endpoint, data=None): + self.ensure_one() + proxmox = self.proxmox_server_id + base_url = proxmox.url.rstrip('/') + headers = { + "Authorization": f"PVEAPIToken={proxmox.api_token_id}={proxmox.api_token_secret}" + } + url = f"{base_url}/api2/json/{endpoint}" + + urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning) + + try: + response = requests.request(method, url, headers=headers, json=data, verify=False) + response.raise_for_status() + return response.json() + except requests.exceptions.RequestException as e: + raise UserError(_("Proxmox API request failed: %s") % str(e)) + + def action_start(self): + for server in self: + vm_type = 'lxc' if server.ct_id else 'qemu' + vm_id = server.ct_id or server.vm_id + self._proxmox_request('POST', f'nodes/pve/{vm_type}/{vm_id}/status/start') + self.fetch_state() + + def action_shutdown(self): + for server in self: + vm_type = 'lxc' if server.ct_id else 'qemu' + vm_id = server.ct_id or server.vm_id + self._proxmox_request('POST', f'nodes/pve/{vm_type}/{vm_id}/status/shutdown') + self.fetch_state() + + def action_stop(self): + for server in self: + vm_type = 'lxc' if server.ct_id else 'qemu' + vm_id = server.ct_id or server.vm_id + self._proxmox_request('POST', f'nodes/pve/{vm_type}/{vm_id}/status/stop') + self.fetch_state() + + def action_reboot(self): + for server in self: + vm_type = 'lxc' if server.ct_id else 'qemu' + vm_id = server.ct_id or server.vm_id + self._proxmox_request('POST', f'nodes/pve/{vm_type}/{vm_id}/status/reboot') + self.fetch_state() + + def fetch_state(self): + for server in self: + vm_type = 'lxc' if server.ct_id else 'qemu' + vm_id = server.ct_id or server.vm_id + status = self._proxmox_request('GET', f'nodes/pve/{vm_type}/{vm_id}/status/current') + server.state = 'running' if status['data']['status'] == 'running' else 'stopped' + + + def action_fetch_proxmox_data(self): self.ensure_one() if not self.proxmox_server_id: @@ -129,6 +189,8 @@ class VPSServer(models.Model): else: # QEMU self.os = config_data.get('ostype', 'Unknown') + self.fetch_state() + return { 'type': 'ir.actions.client', 'tag': 'display_notification', diff --git a/ow_vm_management/views/vps_server_views.xml b/ow_vm_management/views/vps_server_views.xml index c062d36..fcd44a5 100644 --- a/ow_vm_management/views/vps_server_views.xml +++ b/ow_vm_management/views/vps_server_views.xml @@ -6,7 +6,12 @@
+