Add stop/start and state for vps
This commit is contained in:
@@ -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',
|
||||
|
||||
Reference in New Issue
Block a user