% !TeX root = ../thesis.tex
%----------------------------------------------------------------------------
\chapter{Teszt környezet kialakítása}
%----------------------------------------------------------------------------

A munkám során elkészített és módosított szoftverek helyes működésének demonstrálása egy teljes peremhálózati és felhő számítástechnikai rendszer kiépítését igénylik. Mivel az ilyen környezetek sokszor nem állnak rendelkezésünkre, ezért szükség van egy olyan megoldásra, amely jól modellezi az ilyen rendszerek működését, így képesek vagyunk az alkalmazásainkat telepíteni benne.

Vannak szituációk amikor egy teljesen kontrollált tesztkörnyezet alkalmazását kívánja meg a teszt szcenárió. Egy ilyen környezetben a rendszerben elvárás, hogy minden lényeges paramétere szabadon módosítható és precízen megfigyelhető legyen. 

Ebben a fejezetben egy ilyen tesztkörnyezet fejlesztését és kialakítását mutatom be. A munkám során később ebben a rendszerben tudom tesztelni az elkészült szoftver rendszereket.

\section{Célkitűzések}

A tesztkörnyezet egy modellje a valódi környezetnek, amelyben a tesztelni kívánt alkalmazások futnak. A modell lényege, hogy a valóságnak egy egyszerűsített mását adja. A mérések szempontjából fontos tulajdonságokat megtartsa, ideális esetben konfigurálhatóvá tegye. A mérés szempontjából nem lényeges vagy nem befolyásoló tényezőket elhagyhatjuk a modellből, ezzel egyszerűsítve annak működését, hogy a funkcionalitásra tudjunk koncentrálni.

A tesztkörnyezet megtervezése előtt összefoglaltam, hogy mik azok a tulajdonságok, amiket át kell emelni a modellbe és mik azok, amelyekkel nem kell foglalkozni. Ezek megfogalmazásánál figyelembe vettem azt, hogy az előző fejezetekben ismeretet munkám eredményei jól demonstrálhatóak legyenek. Azok a tulajdonságok, amelyeket a modellnek meg kell valósítania, a következők:
\begin{itemize}
	\item A választott futtatási környezet minden tulajdonságát egy-az-egyben meg kell valósítania.
	\item Legalább egy perem és egy felhő infrastruktúra környezet legyen modellezve.
	\item A felhő, perem infrastruktúra és kliens közötti hálózati tulajdonságok konfigurálhatóak legyenek.
\end{itemize}

További követelmény a tesztkörnyezet felé, hogy telepítése egyszerű legyen és hordozható. Igény esetén akár egy fejlesztő vagy tesztelő képes legyen a saját számítógépén is elindítani és használni. A benne futtatott teszteknek reprodukálhatónak kell lennie, azaz két teszt között a tesztet befolyásoló tényezők ne változzanak.

Azok mellett a követelmények mellett, amelyeket a modellnek teljesítenie kell, érdemes megemlíteni néhány tulajdonságát a rendszernek, amelyet az egyszerűsítés kedvéért érdemes elhanyagolni. Ilyenek a kliens eszközök konkrét fizikai környezete. Mivel a munkám elsősorban a felhő alkalmazások átalakítására, implementálására és a köztük lévő hálózati kapcsolat vizsgálatára irányult, ezért a konkrét kliensek fizikai környezete és megvalósítása nem játszik szerepet. 

Mivel mindkét szoftver, amellyel a korábbi fejezetekben foglalkoztam tartalmaz olyan komponenst, amely a környezetéről gyűjt információt (Hangrögzítés), vagy éppen abba avatkozik bele (Robotkarok tárgyakat mozgatnak), ezeket a funkcionalitásokat érdemes emulálni. Szükség esetén érdemes fenntartani a lehetőséget, hogy valódi eszközöket csatlakoztassunk a tesztkörnyezethez.

\section{Magas szintű tervezés}

A kijelölt célok megvalósítására egy teljesen virtuális környezetet terveztem meg. Az egyes szerepeket virtuális gépek, vagy azok egy csoportja látja el.

A teszt infrastruktúrát két szempontból bontottam fel: az egyik az előbb említett szerepek és azok kapcsolata, a másik pedig a szoftverek telepítésének rétegei, mivel ezek a rétegek egymásra épülnek. Minden komponens konfigurációja egységes, egyedi konfigurációk változtatása a telepítés során adja ki a végleges infrastruktúrát. A két felbontást két dimenzión ábrázolva \aref{fig:birbemu_layers}.\ ábra részletezi. A függőleges felbontás az egyes szerepeket, míg a vízszintes felbontás a telepítés rétegeit ábrázolja.


\begin{figure}[h!]
	\centering
	\includegraphics[width=0.35\textwidth]{figures/birbemu_layers}
	\caption{Virtuális környezet tervezésének felbontása két dimenzió mentén}
	\label{fig:birbemu_layers}
\end{figure}


\subsection{Szerepek szerinti felbontás}

\subsubsection{Futtató környezet}

A környezetben szükség van a választott alkalmazás futtató keretrendszer (esetünkben \textit{Kubedfed}) futtatására. A \textit{Kubefed} lényegében több \textit{Kubernetes} klaszter fölé húzott közös vezérlési réteg. Ennek megfelelően virtuális gépeket csoportokra bontottam, adott csoportok egy-egy \textit{Kubernetes} klasztert valósítanak meg.

Az egyes \textit{Kubernetes} klaszterek esetünkben az egyes adatközpontokat szimbolizálják. Egy ilyen klaszter jelöli a felhő adatközpontot, a többi klaszter pedig jelölheti a peremhálózati adatközpontokat vagy akár további felhőket is. A tesztelendő alkalmazások szempontjából, nincs számottevő különbség egy felhő vagy egy peremhálózati adatközpont belső működésében, ezért itt főképp csak az elnevezésükben térnek el.

Az önálló \textit{Kubernetes} klaszterek fölé már lehet \textit{Kubefed} környezetet telepíteni. A telepített \textit{Kubefed} szoftver megfelelően modellezi a valós környezetben használt futtató környezetet, hiszen ugyanaz a szoftver. Telepítése és üzemeltetése között nincs különbség a valós és teszt környezetben.

\subsubsection{Kliens}

A peremhálózati rendszerek három rétegű architektúrájában legalul foglal helyet maga a kliens eszköz. A klienseket ebben a környezetben egy vagy több önálló virtuális gép valósítja meg. Egy virtuális gép egy vagy több klienst is megvalósíthat, függően a kliensek erőforrás és hálózati konfiguráció igényeitől.


\subsubsection{Hálózat}

A célok között fontos szerepet képviselt az egyes \enquote{adatközpontokat} illetve adatközpontokat kliensekkel összekötő hálózat, és azok sajátosságainak megfelelő modellezése. Ez magában foglalja a különböző hálózati anomáliák és kedvezőtlen paraméterek szimulálását is.

Ehhez az egy \enquote{adatközponthoz} tartozó virtuális gépeket közös adatkapcsolati rétegbe szerveztem. A hálózat fizikai és adatkapcsolati rétegeit a virtualizációs környezet biztosítja. Az egyes elszeparált alhálózati rétegek mindegyikét saját alhálózatukba rendeztem. A kliens eszközök önmaguk is egy vagy több elszeparált alhálózatba kerülhetnek.

Az alhálózatok között az útválasztást egy külön virtuális gép végzi, amely olyan szoftvert futtat ami képes különböző egyedileg konfigurálható hálózati paramétereket emulálni. Ezek a paraméterek elsősorban késleltetés, sávszélesség, csomagvesztés stb.


\subsection{Telepítés rétegei szerinti felbontás}

A környezet felépítését rétegekre osztottam. Ennek az a célja, hogy az egyes rétegek telepítése önállóan jól definiálható és tervezhető legyen. További előnye ennek a felosztásnak, hogy az egyes rétegek szükség esetén cserélhetőek más megoldásokra, ezzel elérve, hogy a tesztkörnyezet könnyen testreszabható legyen.

Az egyes rétegek egymásra épülésének sorrendje a következő:
\begin{enumerate}
	\item \textbf{Virtualizációs környezet:} Platform, amely a virtualizált infrastruktúra futtatását megvalósítja.
	\item \textbf{(Virtuális) infrastruktúra:} A konkrét virtuális gépek és a virtuális hálózat konfigurációja.
	\item \textbf{Operációs rendszer konfiguráció:} A használt operációs rendszer és a környezetben való működéséhez szükséges konfiguráció.
	\item \textbf{Futtatókörnyezet:} Alkalmazás futtató környezet, amely felel a tesztelni kívánt alkalmazás futtatásáért. Egyben megfelel a valós környezetben használt futtató környezettel. 
	\item \textbf{Alkalmazás:} A futtatókörnyezetbe telepített egyéni alkalmazások, amelyek tesztelését végezzük.
\end{enumerate}

Az egyes rétegeinek telepítésére önálló automatizációs megoldásokat terveztem használni. A rétegek megfelelő szeparálása ezeknek az eszközöknek a kiválasztását, beállítását és alkalmazását is megkönnyíti. Lehetőségünk van olyan eszközöket használni, amelyek az egyes rétegeken belüli feladatcsoportok végrehajtására specializáltak.

\section{Megvalósítás}

A munka során a terveim alapján konkrétan megvalósított környezetem három \textit{Kubernetes} klaszterből áll. Ebből egy jelképezi a felhőt (\texttt{cloud}), a másik kettő a peremhálózati rendszert (\texttt{edge-1}, \texttt{edge-2}). Az útválasztást egy külön virtuális gép végzi. Kliens eszköz modellezéséhez egy külön virtuális gép fut. A környezet felépítését és az egyes virtuális gépek viszonyát \aref{fig:birb_edgemu_architecture}.\ ábra szemlélteti. 

\begin{figure}[h!]
	\centering
	\includegraphics[width=0.8\textwidth]{figures/birb_edgemu_architecture-less network}
	\caption{Teszt környezet architekturális vázlata}
	\label{fig:birb_edgemu_architecture}
\end{figure}

A \textit{Kubefed} federáció tagjai a \texttt{cloud}, \texttt{edge-1} és \texttt{edge-2} nevű klaszterek. Ezek közül a \texttt{cloud} nevű klaszter a federációt vezérlő klaszter.

\subsection{Virtuális gépek és hálózat}
% cloudinit

\subsection{Operációs rendszer konfigurációja}

% leírni mindhárom classt: kliens-emu, router, kubememe memeber

\subsection{\textit{Kubernetes} telepítése}


% Nginx ingress controller
% Longhorn storage class

\subsection{\textit{Kubefed} telepítése}


\section{Környezet alkalmazása}

% tc tutorial basically

%\section{Környezet értékelése}

% fogom a pontokat a célokból és elmondom, hogy mindet tök királyul teljesítettem.