diff --git a/Latex/Chapter2.tex b/Latex/Chapter2.tex index 0a53b8a..406d96e 100644 --- a/Latex/Chapter2.tex +++ b/Latex/Chapter2.tex @@ -53,7 +53,7 @@ \label{fig:ensp} \end{figure} -Эти решения ближе к реальной настройке сети, чем универсальные диаграммеры: они позволяют нарисовать топологию (а также) моделировать поведение сетевых устройств. Однако их назначение далеко от цели данной работы. Диаграммеры в их составе ориентированы на описание сети на основе оборудования конкретного производителя, а не на универсальное формализованное описание конфигурации сети виртуальных машин для лабораторных стендов. +Эти решения ближе к реальной настройке сети, чем универсальные диаграммеры: они позволяют нарисовать топологию сетевых устройств, однако их назначение далеко от цели данной работы. Диаграммеры в их составе ориентированы на описание сети на основе оборудования конкретного производителя, а не на универсальное формализованное описание конфигурации сети виртуальных машин для лабораторных стендов. \subsection{Генераторы диаграмм} @@ -73,7 +73,7 @@ \label{fig:graphviz} \end{figure} -\begin{figure}[htbp] +\begin{figure}[H] \centering \includegraphics[width=0.8\textwidth]{files/plantuml.png} \caption{Диаграмма сети в PlantUML} diff --git a/Latex/Chapter3.tex b/Latex/Chapter3.tex index e550f9e..c19ab3d 100644 --- a/Latex/Chapter3.tex +++ b/Latex/Chapter3.tex @@ -4,7 +4,7 @@ Исходя из результатов обзора, в качестве пользовательской формы задания конфигурации выбрано табличное представление. Такая форма представления удобна тем, что позволяет явно фиксировать элементы сети и их атрибуты, редактировать отдельные значения и проверять заполненность полей. При этом она допускает частично заданные конфигурации: часть параметров может быть указана сразу, а часть оставлена пустой для последующего уточнения. -При разработке табличного представления конфигурации сети виртуальных машин рассматривались два варианта организации данных: представление в первой нормальной форме (далее - 1НФ) и представление в третьей нормальной форме (далее - 3НФ). Оба варианта позволяют структурированно описать сеть, однако различаются сложностью редактирования данных в случае непосредственной работы с таблицами. Вторая нормальная форма отдельно не рассматривалась как самостоятельный вариант представления, поскольку для данной задачи она является промежуточным этапом между компактным пользовательским описанием и полностью разнесённой структурой данных. +При разработке табличного представления конфигурации сети виртуальных машин рассматривались два варианта организации данных: представление в первой нормальной форме (далее~-- 1НФ) и представление в третьей нормальной форме (далее~-- 3НФ). Оба варианта позволяют структурированно описать сеть, однако различаются сложностью редактирования данных в случае непосредственной работы с таблицами. Разберём оба представления на примере топологии, изображённой на рисунке~\ref{fig:exmpl1} @@ -126,7 +126,7 @@ PC4.eth1 & 10.0.0.4/24 \\ \label{tab:3nf3} \end{table} -\subsubsection*{Выбор формы} +\subsubsection*{Выбор представления} В качестве основного пользовательского представления была выбрана первая нормальная форма. Она удобнее в сравнении с 3НФ для ручного заполнения, проще воспринимается при описании лабораторных стендов и не требует постоянного перехода между большим количеством связанных таблиц. diff --git a/Latex/Chapter4.tex b/Latex/Chapter4.tex index 52fc866..959d9a7 100644 --- a/Latex/Chapter4.tex +++ b/Latex/Chapter4.tex @@ -8,43 +8,68 @@ %\label{fig:uml_model} %\end{figure} -\begin{figure}[htbp] -\centering -\includegraphics[width=0.8\textwidth]{files/schema.png} -\caption{Процесс работы} -\label{fig:schema} -\end{figure} -Табличное представление используется для ввода, но для дальнейшей обработки требуется программная структура, в которой связи между объектами выражены явно. Поэтому данные таблиц должны преобразовываться во внутреннее представление, например в набор объектов Python (рисуок \ref{fig:uml_model1}), соответствующих основным сущностям конфигурации. Такая модель служит центральным представлением, из которого данные могут быть преобразованы в другие форматы. - -\begin{figure}[htbp] +\begin{figure}[H] \centering -\includegraphics[width=0.8\textwidth]{files/UML.png} -\caption{UML диаграмма классов Python} +\includegraphics[width=1\textwidth]{files/UML.png} +\caption{UML-диаграмма классов Python} \label{fig:uml_model1} \end{figure} +Табличное представление используется для ввода, но для дальнейшей обработки требуется программная структура, в которой связи между объектами выражены явно. Поэтому данные таблиц должны преобразовываться во внутреннее представление, которое было реализовано в виде набора объектов Python (рис. \ref{fig:uml_model1}), соответствующих основным сущностям конфигурации. Такая модель служит центральным представлением, из которого данные могут быть преобразованы в другие форматы. + + + + Также необходима разработка механизмов преобразования модели. Основными преобразованиями являются импорт данных из табличного описания во внутреннюю модель, экспорт во входные языки средства развертывания сетевых конфигураций и средства построения диаграмм. YAML-файл в этом случае используется как структурированное описание, пригодное для дальнейшей обработки программами, вроде Netloom \cite{netloom} для поднятия сети из виртуальных машин, а D2 может применяться для генерации визуального представления сети на основе уже построенной модели. -Программная реализация средства описания конфигурации сети виртуальных машин выполнена на языке Python. Объём написанного кода: 710 строк, 48 килобайт. Код выложен на веб-сервисе Github \cite{github}. На рисунке \ref{fig:schema} представлен основной процесс работы с утилитой. Построение диаграмм происходит с помощью модуля py-d2 (пример на рисунке \ref{fig:diagram}). -\begin{figure}[htbp] +Программная реализация выполнена на языке Python. Объём написанного кода: 710 строк, 48 килобайт. Код выложен на веб-сервисе Github \cite{github}. На рисунке \ref{fig:schema} представлен основной процесс работы с утилитой. Построение диаграмм происходит с помощью модуля py-d2 (пример на рис \ref{fig:diagram}). + + +\begin{figure}[H] \centering -\includegraphics[width=0.8\textwidth]{files/diagram.png} +\includegraphics[width=0.8\textwidth]{files/schema.png} +\caption{Схема работы программной реализации} +\label{fig:schema} +\end{figure} + + +\begin{figure}[H] +\centering +\includegraphics[width=1\textwidth]{files/diagram.png} \caption{Пример диаграмммы, построенной утилитой} \label{fig:diagram} \end{figure} + Воспроизводимость описания конфигурации обеспечивается тем, что результат хранится в виде структурированных данных. Одна и та же таблица при повторной обработке приводит к построению той же внутренней модели и, соответственно, к одинаковому описанию конфигурации. А преобразование в формат, пригодный для использования в средстве развёртывания сети виртуальных машин, обеспечивает возможность дальнейшего применения описания при подготовке лабораторных стендов из виртуальных машин. + \todo[inline]{вынести в отдельное приложение?} + Пример экспортированного YAML-описания конфигурации сети приведён в листинге~\ref{lst:yaml-config}. \lstinputlisting[ language=yaml, caption={Фрагмент YAML-описания конфигурации сети виртуальных машин}, - label={lst:yaml-config} + label={lst:yaml-config}, + frame=single, + framerule=0.4pt, + numbers=left, + numberstyle=\tiny, + basicstyle=\ttfamily\footnotesize, + lineskip=-1pt, + breaklines=true, + columns=fullflexible, + keepspaces=true ]{files/topology.yaml} +% \lstinputlisting[ +% language=yaml, +% caption={Фрагмент YAML-описания конфигурации сети виртуальных машин}, +% label={lst:yaml-config} +% ]{files/topology.yaml} + % Таким образом, решение строится не вокруг построения диаграммы, а вокруг формальной модели сетевой конфигурации. Табличное представление используется как способ ввода и редактирования, внутренняя модель — как основа обработки данных, а YAML и диаграмма — как формы представления результата. Такой подход позволяет обеспечить редактируемость, воспроизводимость и возможность дальнейшего применения описания при подготовке лабораторных стендов из виртуальных машин. diff --git a/Latex/files/d2netw.png b/Latex/files/d2netw.png index ce17a62..6ffe30e 100644 Binary files a/Latex/files/d2netw.png and b/Latex/files/d2netw.png differ diff --git a/Latex/files/diagram.png b/Latex/files/diagram.png index 0cf5421..2ad0e97 100644 Binary files a/Latex/files/diagram.png and b/Latex/files/diagram.png differ diff --git a/Latex/files/exmpl1.png b/Latex/files/exmpl1.png index 6b7c7da..e9957e3 100644 Binary files a/Latex/files/exmpl1.png and b/Latex/files/exmpl1.png differ diff --git a/Latex/files/plantuml.png b/Latex/files/plantuml.png index caa80bb..e1ae631 100644 Binary files a/Latex/files/plantuml.png and b/Latex/files/plantuml.png differ diff --git a/Latex/files/schema.d2 b/Latex/files/schema.d2 index bf8b1c9..cdce3cf 100644 --- a/Latex/files/schema.d2 +++ b/Latex/files/schema.d2 @@ -1,8 +1,9 @@ -сетевая топология -- "табличное представление (.csv)": ручное задание -"табличное представление (.csv)" -- внутренняя модель (Python) : преобразование кодом -внутренняя модель (Python) -- "диаграмма (.svg)" : преобразование кодом (py-d2) -внутренняя модель (Python) -- "описание для Netloom (.yaml)" : преобразование кодом -"описание для Netloom (.yaml)" -- средство развёртывания сетевой топологии (Netloom) { +сетевая топология --> "табличное представление (.csv)": ручное задание +"табличное представление (.csv)" --> внутренняя модель (Python) : разбор +внутренняя модель (Python) --> "описание диаграммы (.d2)" : визуализация +"описание диаграммы (.d2)" --> "диаграмма (.svg)" : использование D2 +внутренняя модель (Python) --> "описание для Netloom (.yaml)" : экспорт +"описание для Netloom (.yaml)" --> средство развёртывания сетевой топологии (Netloom) { style.stroke-dash: 5 } средство развёртывания сетевой топологии (Netloom).style.stroke-dash: 5 diff --git a/Latex/files/schema.png b/Latex/files/schema.png index 31402fa..f700e9b 100644 Binary files a/Latex/files/schema.png and b/Latex/files/schema.png differ diff --git a/Latex/files/schema.svg b/Latex/files/schema.svg index 2aee2e6..79f3030 100644 --- a/Latex/files/schema.svg +++ b/Latex/files/schema.svg @@ -1,17 +1,17 @@ -сетевая топологиятабличное представление (.csv)внутренняя модель (Python)диаграмма (.svg)описание для Netloom (.yaml)средство развёртывания сетевой топологии (Netloom)ручное заданиепреобразование кодомпреобразование кодом (py-d2)преобразование кодом - - - - - + .d2-684299875 .fill-N1{fill:#0A0F25;} + .d2-684299875 .fill-N2{fill:#676C7E;} + .d2-684299875 .fill-N3{fill:#9499AB;} + .d2-684299875 .fill-N4{fill:#CFD2DD;} + .d2-684299875 .fill-N5{fill:#DEE1EB;} + .d2-684299875 .fill-N6{fill:#EEF1F8;} + .d2-684299875 .fill-N7{fill:#FFFFFF;} + .d2-684299875 .fill-B1{fill:#0D32B2;} + .d2-684299875 .fill-B2{fill:#0D32B2;} + .d2-684299875 .fill-B3{fill:#E3E9FD;} + .d2-684299875 .fill-B4{fill:#E3E9FD;} + .d2-684299875 .fill-B5{fill:#EDF0FD;} + .d2-684299875 .fill-B6{fill:#F7F8FE;} + .d2-684299875 .fill-AA2{fill:#4A6FF3;} + .d2-684299875 .fill-AA4{fill:#EDF0FD;} + .d2-684299875 .fill-AA5{fill:#F7F8FE;} + .d2-684299875 .fill-AB4{fill:#EDF0FD;} + .d2-684299875 .fill-AB5{fill:#F7F8FE;} + .d2-684299875 .stroke-N1{stroke:#0A0F25;} + .d2-684299875 .stroke-N2{stroke:#676C7E;} + .d2-684299875 .stroke-N3{stroke:#9499AB;} + .d2-684299875 .stroke-N4{stroke:#CFD2DD;} + .d2-684299875 .stroke-N5{stroke:#DEE1EB;} + .d2-684299875 .stroke-N6{stroke:#EEF1F8;} + .d2-684299875 .stroke-N7{stroke:#FFFFFF;} + .d2-684299875 .stroke-B1{stroke:#0D32B2;} + .d2-684299875 .stroke-B2{stroke:#0D32B2;} + .d2-684299875 .stroke-B3{stroke:#E3E9FD;} + .d2-684299875 .stroke-B4{stroke:#E3E9FD;} + .d2-684299875 .stroke-B5{stroke:#EDF0FD;} + .d2-684299875 .stroke-B6{stroke:#F7F8FE;} + .d2-684299875 .stroke-AA2{stroke:#4A6FF3;} + .d2-684299875 .stroke-AA4{stroke:#EDF0FD;} + .d2-684299875 .stroke-AA5{stroke:#F7F8FE;} + .d2-684299875 .stroke-AB4{stroke:#EDF0FD;} + .d2-684299875 .stroke-AB5{stroke:#F7F8FE;} + .d2-684299875 .background-color-N1{background-color:#0A0F25;} + .d2-684299875 .background-color-N2{background-color:#676C7E;} + .d2-684299875 .background-color-N3{background-color:#9499AB;} + .d2-684299875 .background-color-N4{background-color:#CFD2DD;} + .d2-684299875 .background-color-N5{background-color:#DEE1EB;} + .d2-684299875 .background-color-N6{background-color:#EEF1F8;} + .d2-684299875 .background-color-N7{background-color:#FFFFFF;} + .d2-684299875 .background-color-B1{background-color:#0D32B2;} + .d2-684299875 .background-color-B2{background-color:#0D32B2;} + .d2-684299875 .background-color-B3{background-color:#E3E9FD;} + .d2-684299875 .background-color-B4{background-color:#E3E9FD;} + .d2-684299875 .background-color-B5{background-color:#EDF0FD;} + .d2-684299875 .background-color-B6{background-color:#F7F8FE;} + .d2-684299875 .background-color-AA2{background-color:#4A6FF3;} + .d2-684299875 .background-color-AA4{background-color:#EDF0FD;} + .d2-684299875 .background-color-AA5{background-color:#F7F8FE;} + .d2-684299875 .background-color-AB4{background-color:#EDF0FD;} + .d2-684299875 .background-color-AB5{background-color:#F7F8FE;} + .d2-684299875 .color-N1{color:#0A0F25;} + .d2-684299875 .color-N2{color:#676C7E;} + .d2-684299875 .color-N3{color:#9499AB;} + .d2-684299875 .color-N4{color:#CFD2DD;} + .d2-684299875 .color-N5{color:#DEE1EB;} + .d2-684299875 .color-N6{color:#EEF1F8;} + .d2-684299875 .color-N7{color:#FFFFFF;} + .d2-684299875 .color-B1{color:#0D32B2;} + .d2-684299875 .color-B2{color:#0D32B2;} + .d2-684299875 .color-B3{color:#E3E9FD;} + .d2-684299875 .color-B4{color:#E3E9FD;} + .d2-684299875 .color-B5{color:#EDF0FD;} + .d2-684299875 .color-B6{color:#F7F8FE;} + .d2-684299875 .color-AA2{color:#4A6FF3;} + .d2-684299875 .color-AA4{color:#EDF0FD;} + .d2-684299875 .color-AA5{color:#F7F8FE;} + .d2-684299875 .color-AB4{color:#EDF0FD;} + .d2-684299875 .color-AB5{color:#F7F8FE;}.appendix text.text{fill:#0A0F25}.md{--color-fg-default:#0A0F25;--color-fg-muted:#676C7E;--color-fg-subtle:#9499AB;--color-canvas-default:#FFFFFF;--color-canvas-subtle:#EEF1F8;--color-border-default:#0D32B2;--color-border-muted:#0D32B2;--color-neutral-muted:#EEF1F8;--color-accent-fg:#0D32B2;--color-accent-emphasis:#0D32B2;--color-attention-subtle:#676C7E;--color-danger-fg:red;}.sketch-overlay-B1{fill:url(#streaks-darker-d2-684299875);mix-blend-mode:lighten}.sketch-overlay-B2{fill:url(#streaks-darker-d2-684299875);mix-blend-mode:lighten}.sketch-overlay-B3{fill:url(#streaks-bright-d2-684299875);mix-blend-mode:darken}.sketch-overlay-B4{fill:url(#streaks-bright-d2-684299875);mix-blend-mode:darken}.sketch-overlay-B5{fill:url(#streaks-bright-d2-684299875);mix-blend-mode:darken}.sketch-overlay-B6{fill:url(#streaks-bright-d2-684299875);mix-blend-mode:darken}.sketch-overlay-AA2{fill:url(#streaks-dark-d2-684299875);mix-blend-mode:overlay}.sketch-overlay-AA4{fill:url(#streaks-bright-d2-684299875);mix-blend-mode:darken}.sketch-overlay-AA5{fill:url(#streaks-bright-d2-684299875);mix-blend-mode:darken}.sketch-overlay-AB4{fill:url(#streaks-bright-d2-684299875);mix-blend-mode:darken}.sketch-overlay-AB5{fill:url(#streaks-bright-d2-684299875);mix-blend-mode:darken}.sketch-overlay-N1{fill:url(#streaks-darker-d2-684299875);mix-blend-mode:lighten}.sketch-overlay-N2{fill:url(#streaks-dark-d2-684299875);mix-blend-mode:overlay}.sketch-overlay-N3{fill:url(#streaks-normal-d2-684299875);mix-blend-mode:color-burn}.sketch-overlay-N4{fill:url(#streaks-normal-d2-684299875);mix-blend-mode:color-burn}.sketch-overlay-N5{fill:url(#streaks-bright-d2-684299875);mix-blend-mode:darken}.sketch-overlay-N6{fill:url(#streaks-bright-d2-684299875);mix-blend-mode:darken}.sketch-overlay-N7{fill:url(#streaks-bright-d2-684299875);mix-blend-mode:darken}.light-code{display: block}.dark-code{display: none}]]>сетевая топологиятабличное представление (.csv)внутренняя модель (Python)описание диаграммы (.d2)диаграмма (.svg)описание для Netloom (.yaml)средство развёртывания сетевой топологии (Netloom) ручное заданиеразборвизуализацияиспользование D2экспорт + + + + + + diff --git a/Latex/files/topology.yaml b/Latex/files/topology.yaml index bf7ac14..14a3780 100644 --- a/Latex/files/topology.yaml +++ b/Latex/files/topology.yaml @@ -2,77 +2,25 @@ meta: id: topology.yaml name: topology.yaml networks: -- name: NA -- name: NB -- name: NC +- name: A nodes: - role: host - name: H1 + name: PC1 interfaces: eth1: - ip: null - network: NA - gateway: null - index: 1 - eth2: - ip: null - network: NB - gateway: null - index: 2 - bridges: [] - vlans: [] -- role: host - name: H2 - interfaces: - eth1: - ip: null - network: NA + ip: 10.0.0.1/24 + network: A gateway: null index: 1 bridges: [] vlans: [] - role: host - name: H3 + name: PC2 interfaces: eth1: - ip: null - network: NA + ip: 10.0.0.2/24 + network: A gateway: null index: 1 bridges: [] vlans: [] -- role: host - name: H4 - interfaces: - eth1: - ip: null - network: NB - gateway: null - index: 1 - bridges: [] - vlans: [] -- role: host - name: H5 - interfaces: - eth1: - ip: null - network: NC - gateway: null - index: 1 - bridges: [] - vlans: [] -- role: host - name: H6 - interfaces: - eth1: - ip: null - network: null - gateway: null - index: 1 - eth2: - ip: null - network: NC - gateway: null - index: 2 - bridges: [] - vlans: []