Compare commits

...

5 Commits

49
main.py
View File

@@ -2,6 +2,7 @@
import os import os
import json import json
from time import sleep
import requests import requests
@@ -27,21 +28,30 @@ class PortainerClient:
"X-API-Key": self.access_token "X-API-Key": self.access_token
} }
def list_endpoints(self): def _get(self, uri):
response = requests.get(f"{self.api_url}/endpoints", headers=self._get_headers()) response = requests.get(f"{self.api_url}/{uri}", headers=self._get_headers())
return response.json() return response.json()
def list_endpoints(self):
return self._get("endpoints")
def list_stacks(self, endpoint_id=None): def list_stacks(self, endpoint_id=None):
filters = f'?filters={{"EndpointID":{endpoint_id}}}' if endpoint_id else "" filters = f'?filters={{"EndpointID":{endpoint_id}}}' if endpoint_id else ""
response = requests.get(f"{self.api_url}/stacks{filters}", headers=self._get_headers()) return self._get(f'stacks{filters}')
return response.json()
def get_stack(self, stack_id): def get_stack(self, stack_id):
response = requests.get(f"{self.api_url}/stacks/{stack_id}", headers=self._get_headers()) return self._get(f'stacks/{stack_id}')
return response.json()
def get_stack_file(self, stack_id): def get_stack_file(self, stack_id):
response = requests.get(f"{self.api_url}/stacks/{stack_id}/file", headers=self._get_headers()) return self._get(f'stacks/{stack_id}/file')
def _put(self, uri, payload):
response = requests.put(
f"{self.api_url}/{uri}",
headers=self._get_headers(),
json=payload
)
return response.json() return response.json()
def upgrade_stack(self, stack): def upgrade_stack(self, stack):
@@ -52,22 +62,12 @@ class PortainerClient:
"StackFileContent": file_response["StackFileContent"], "StackFileContent": file_response["StackFileContent"],
"Env": stack["Env"] "Env": stack["Env"]
} }
response = requests.put(
f"{self.api_url}/stacks/{stack['Id']}?endpointId={stack['EndpointId']}",
headers=self._get_headers(),
json=payload
)
return response.json() return self._put(f"stacks/{stack['Id']}?endpointId={stack['EndpointId']}", payload)
def list_stack_containers(self, endpoint, stack_name): def list_stack_containers(self, endpoint, stack_name):
filters = '{"label":["com.docker.compose.project=' + stack_name + '"]}' filters = '{"label":["com.docker.compose.project=' + stack_name + '"]}'
response = requests.get( return self._get(f'endpoints/{endpoint}/docker/containers/json?all=1&filters={filters}')
f"{self.api_url}/endpoints/{endpoint}/docker/containers/json?all=1&filters={filters}",
headers=self._get_headers()
)
return response.json()
def update_image(self, endpoint, image): def update_image(self, endpoint, image):
response = requests.post( response = requests.post(
@@ -88,6 +88,14 @@ class PortainerClient:
headers=self._get_headers() headers=self._get_headers()
) )
def ping_server(self):
try:
r = requests.get(f"{self.portainer_url}/", headers=self._get_headers())
except requests.exceptions.ConnectionError:
return False
return r.status_code == 200
def update_repositories(): def update_repositories():
for repo_path in config.git_repositories: for repo_path in config.git_repositories:
@@ -136,6 +144,9 @@ def upgrade_endpoint_stack(client, endpoint):
print(f"{stack_name} was updated. Restarting...") print(f"{stack_name} was updated. Restarting...")
if endpoint_id == 2 and stack_name in ('portainer', 'traefik'): if endpoint_id == 2 and stack_name in ('portainer', 'traefik'):
upgrade_local_stack(stack) upgrade_local_stack(stack)
while not client.ping_server():
print("Waiting for server to be back online...")
sleep(1)
else: else:
client.upgrade_stack(stack) client.upgrade_stack(stack)
print(f"{stack_name} restarted.") print(f"{stack_name} restarted.")