Add stop/start and state for vps
This commit is contained in:
Binary file not shown.
@@ -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',
|
||||
|
||||
@@ -6,7 +6,12 @@
|
||||
<field name="arch" type="xml">
|
||||
<form>
|
||||
<header>
|
||||
<button name="action_start" string="Start" type="object" icon="fa-play" attrs="{'invisible': [('state', '=', 'running')]}" class="oe_highlight"/>
|
||||
<button name="action_shutdown" string="Shutdown" type="object" icon="fa-power-off" attrs="{'invisible': [('state', '!=', 'running')]}" class="oe_highlight"/>
|
||||
<button name="action_stop" string="Stop" type="object" icon="fa-stop" attrs="{'invisible': [('state', '!=', 'running')]}" class="text-danger"/>
|
||||
<button name="action_reboot" string="Reboot" type="object" icon="fa-refresh" attrs="{'invisible': [('state', '!=', 'running')]}" class="oe_highlight"/>
|
||||
<button name="action_fetch_proxmox_data" string="Fetch Proxmox Data" type="object" class="oe_highlight"/>
|
||||
<field name="state" widget="statusbar"/>
|
||||
</header>
|
||||
<sheet>
|
||||
<group>
|
||||
|
||||
Reference in New Issue
Block a user