dpzc-4/02_PaaS/02_zadania.ipynb
nlitkowski e248075771 a
2022-01-05 01:08:54 +01:00

213 lines
7.4 KiB
Plaintext

{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Zadania domowe\n",
"\n",
"W ramach tego modułu do zdobycia są 4 punkty. Wszystkie zadania bazują na platformie Heroku. W przypadku rozwiązania (poprawnego) zadania 1.2 nie ma potrzeby wykonywania zadania 1.1.\n",
"\n",
"## Zadanie 1.1 (2 punkty)\n",
"Uruchom dowolną aplikacje na swoim koncie Heroku. Nazwa aplikacji musi być ustawiona na `uam-wmi-pzc-<INDEX>-z-1-1`. Strona musi być renderowana w całości po stronie serwera i zawierać w tagu body tylko bieżący czas UTC w formacie ISO 8601 (YYYY-MM-DDThh:mm:ss+00:00) jak w poniższym przykładzie:\n",
"\n",
"```html\n",
"<html>\n",
"<head>\n",
" <title>Rozwiązanie zadania PZC 1.1</title>\n",
"</head>\n",
"<body>\n",
"2021-07-29T11:15:02+00:00\n",
"</body>\n",
"```"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Sposób sprawdzania zadania\n",
"Poprawność wykonania zadania można sprawdzić korzystając ze skryptu. Konieczne jest podstawienie poprawego numeru indeksu w pierwszej lini skryptu."
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"tags": []
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Requirement already satisfied: bs4 in /home/faculty/bikol/.local/lib/python3.7/site-packages (0.0.1)\n",
"Requirement already satisfied: beautifulsoup4 in /home/faculty/bikol/.local/lib/python3.7/site-packages (from bs4) (4.10.0)\n",
"Requirement already satisfied: soupsieve>1.2 in /home/faculty/bikol/.local/lib/python3.7/site-packages (from beautifulsoup4->bs4) (2.2.1)\n",
"\u001b[33mWARNING: You are using pip version 21.2.3; however, version 21.3 is available.\n",
"You should consider upgrading via the '/usr/bin/python3 -m pip install --upgrade pip' command.\u001b[0m\n",
"\n",
"========================================\n",
"\n",
"Zadanie 1.1 nie zaliczone\n",
"\n",
"========================================\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"Błędny format daty:\n",
"test\n",
"2021-10-27T10:27:33+00:00\n"
]
}
],
"source": [
"from __future__ import print_function\n",
"\n",
"!pip3 install bs4 --user\n",
"\n",
"INDEX=\"329575\"\n",
"\n",
"from bs4 import BeautifulSoup\n",
"import urllib.request\n",
"from datetime import datetime\n",
"from datetime import timezone\n",
"import sys\n",
"\n",
"def eprint(*args, **kwargs):\n",
" print(*args, file=sys.stderr, **kwargs)\n",
"\n",
"def test_solution(index):\n",
" valid = False\n",
" try:\n",
" with urllib.request.urlopen('https://uam-wmi-pzc-'+index+'-z-1-1.herokuapp.com/') as response:\n",
" html = response.read()\n",
" soup = BeautifulSoup(html, 'html.parser')\n",
" try:\n",
" dateText = soup.body.get_text().strip()\n",
" try:\n",
" now = datetime.now(tz=timezone.utc)\n",
" date = datetime.fromisoformat(dateText)\n",
"\n",
" eprint(\"Data na stronie %s\"%date)\n",
" if abs(date - now).seconds < 1:\n",
" valid = True\n",
"\n",
" except:\n",
" eprint(\"Błędny format daty:\")\n",
" eprint(dateText)\n",
" except:\n",
" eprint(\"Nie udało się pobrać treści tagu <body>\")\n",
"\n",
" except urllib.error.URLError as e:\n",
" eprint(e.status)\n",
" \n",
" return valid\n",
"\n",
"print(\"\\n========================================\\n\")\n",
"if test_solution(INDEX):\n",
" print(\"Zadanie 1.1 zaliczone\")\n",
"else:\n",
" print(\"Zadanie 1.1 nie zaliczone\")\n",
"print(\"\\n========================================\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Zadanie 1.2 (4 punkty)\n",
"Celem tego zadania jest poznanie bardziej zaawansowanych możliwości wdrażania aplikacji na platformę Heroku. \n",
"\n",
"Zadanie polega na uruchomieniu na platformie Heroku systemu [Gitea](https://gitea.io/). W tym celu konieczne jest przygotowanie odpowiedniego [pliku YAML](https://devcenter.heroku.com/articles/build-docker-images-heroku-yml), który umożliwi utworzenie odpowiednich zasobów w ramach platformy Heroku oraz dokona ich konfiguracji.\n",
"\n",
"Jako punkt odniesienia proszę korzystać z oficjalnej instrukcji instalacji Gitea z wykorzystaniem Dockera w trybie rootless. W szczególności następujący plik `docker-compose.yml` zawiera wszystkie niezbędne informacje do wykonania zadania (należy go przetłumaczyć na plik `heroku.yml`):\n",
"\n",
"```YAML\n",
"version: \"2\"\n",
"\n",
"services:\n",
" server:\n",
" image: gitea/gitea:1.14.5-rootless\n",
" environment:\n",
" - GITEA__database__DB_TYPE=postgres\n",
" - GITEA__database__HOST=db:5432\n",
" - GITEA__database__NAME=gitea\n",
" - GITEA__database__USER=gitea\n",
" - GITEA__database__PASSWD=gitea\n",
" restart: always\n",
" volumes:\n",
" - ./data:/var/lib/gitea\n",
" - ./config:/etc/gitea \n",
" - /etc/timezone:/etc/timezone:ro\n",
" - /etc/localtime:/etc/localtime:ro\n",
" ports:\n",
" - \"3000:3000\"\n",
" - \"2222:2222\"\n",
" depends_on:\n",
" - db\n",
"\n",
" db:\n",
" image: postgres:13\n",
" restart: always\n",
" environment:\n",
" - POSTGRES_USER=gitea\n",
" - POSTGRES_PASSWORD=gitea\n",
" - POSTGRES_DB=gitea\n",
" volumes:\n",
" - ./postgres:/var/lib/postgresql/data\n",
"```\n",
"\n",
"\n",
"> **Wskazówka:**: Skorzystaj z usługi [Managed PostgreSQL from Heroku](https://www.heroku.com/postgres) oraz sekcji `setup` pliku `heroku.yml`.\n",
"\n",
"\n",
"### Sposób sprawdzania zadania\n",
"\n",
"Zadanie to sprawdzane będzie ręcznie, jesteś zobowiązany udostępnić:\n",
"\n",
"1. repozytorium Git zawierające całe rozwiązanie zadania\n",
"\n",
" Kod na repozytorium musi być kompletny, oraz umożliwiać automatyczne wdrożenie na platformę Heroku poprzez:\n",
" ```bash\n",
" heroku git:remote\n",
" git push heroku master\n",
" ```\n",
"\n",
" Zakładamy przy tym, że odpowiednia aplikacja Heroku została już utwożona i skonfigurowana pod odpowiedni *stack*.\n",
"\n",
"1. link do wdrożonej aplikacji\n",
"\n",
" Wdrożona Gitea powinna hostować przynajmniej jedno repozytorium git."
]
}
],
"metadata": {
"interpreter": {
"hash": "98b0a9b7b4eaaa670588a142fd0a9b87eaafe866f1db4228be72b4211d12040f"
},
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.7.3"
}
},
"nbformat": 4,
"nbformat_minor": 4
}