From d3a6563d8cb737c1e822f114612b634cc469ad45 Mon Sep 17 00:00:00 2001 From: Marcin Siodelski Date: Thu, 9 Jan 2020 13:40:53 +0100 Subject: [PATCH 01/10] [#122] Updated list of containers in install The latest Stork version starts considerably more containers than the previous version. This was described in the installation section. --- doc/install.rst | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/doc/install.rst b/doc/install.rst index 6168661ab..16a8546e0 100644 --- a/doc/install.rst +++ b/doc/install.rst @@ -40,15 +40,27 @@ install it on your host, see the next section about Native installation. Once the build process finishes, Stork UI will be available at http://localhost:8080/. Use any browser to connect. +The installation procedure will create several Docker images: + +- `stork_webui`: exposing web UI interface, +- `stork_server`: running a server backend, +- `postgres`: running a PostgreSQL database used by the server, +- `stork_agent-bind9`: running an demo instance of BIND9, +- `stork_agent-kea`: running a demo instance of Kea DHCPv4 server, +- `stork_agent-kea-ha1`: running the primary Kea DHCPv4 server in High Availability mode, +- `stork_agent-kea-ha2`: running the secondary Kea DHCPv4 server in High Availability mode + .. note:: - The installation procedure will create 3 Docker images: `stork_webui`, `stork_server` and `postgres`. - The PostgreSQL database schema will be automatically migrated to the latest version required - by the Stork server process. + The containers running Kea and BIND9 applications are for demo purposes only. They + allow the users to quickly start playing with Stork without having to manually + deploy Kea and/or BIND9 instances. + +The PostgreSQL database schema will be automatically migrated to the latest version required +by the Stork server process. - If you run unit-tests, also `stork-ui-pgsql` image will be created. The installation - procedure assumes those images are fully under Stork control. If there are existing images, - they will be overwritten. +The installation procedure assumes those images are fully under Stork control. If there are +existing images, they will be overwritten. There are several other rake targets. For a complete list of available tasks, use `rake -T`. Also see `wiki `_ -- GitLab From 6aec0beb28d5ed5619fc29aa3231884136a53f0c Mon Sep 17 00:00:00 2001 From: Marcin Siodelski Date: Thu, 9 Jan 2020 14:17:22 +0100 Subject: [PATCH 02/10] [#122] Updated section about user mgmt Included new groups: super-admin and admin and the fact they need to be specified for the new user account. --- doc/usage.rst | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/doc/usage.rst b/doc/usage.rst index 9beb5c031..3a140a866 100644 --- a/doc/usage.rst +++ b/doc/usage.rst @@ -11,8 +11,9 @@ to http://localhost:4200. Managing users ============== -Currently, the default administrator's account is created and can be used to sign in to the system -via the web UI. Please use the login ``admin`` and password ``admin`` to sign in to the system. +Upon the initial installation the default administrator's account is created and can be used to +sign in to the system via the web UI. Please use the login ``admin`` and password ``admin`` to +sign in to the system. To manage users, click on the ``Configuration`` menu and choose ``Users``. You will see a list of existing users. At the very least, there will be user ``admin``. @@ -21,20 +22,23 @@ To add new user, click ``Create User Account``. A new tab will opened that will new account parameters. Some fields have specific restrictions. Username can consist of only letters, numbers and underscore. E-mail field is optional. However, if specified, it must be a well formed e-mail. First and lastname fields are mandatory. Password must only contain letters, digits, -@, ., !, +, - and must be at least 8 characters long. Once all requirements are met, the ``Save`` -button will become active and you will be able to add new account. +@, ., !, +, - and must be at least 8 characters long. -.. note:: +As of Stork 0.3 release, the users are be associated with one of the two predefined groups (roles), +i.e. ``super-admin`` or ``admin``, which must be selected when the user account is created. The +users belonging to the ``super-admin`` group are granted full privileges in the system, including +creation and management of users' accounts. The ``admin`` group has similar privileges, except that +the users belonging to this group are not allowed to manage other users' accounts. - As of Stork 0.2.0 release, the role-based access control is not implemented yet. Every user - is considered a super-admin and has full control over the system. +Once the new user account information has been specified and all requirements are met, the +``Save``button will become active and you will be able to add new account. Deploying Stork Agent ===================== Stork system uses agents to monitor services. Stork Agent (`STAG` or simply `agent`) is a -daemon that is expected to be deployed and run on each machine to be monitored. As of Stork 0.2.0 +daemon that is expected to be deployed and run on each machine to be monitored. As of Stork 0.3.0 release there are no automated deployment routines and STAG has to be copied and run manually. This can be done in a variety of ways. Here is one of them. -- GitLab From 8b7df9f8c231d2b7247c60c30b79121f140df822 Mon Sep 17 00:00:00 2001 From: Marcin Siodelski Date: Thu, 9 Jan 2020 14:46:01 +0100 Subject: [PATCH 03/10] [#122] Added section about changing password --- doc/usage.rst | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/doc/usage.rst b/doc/usage.rst index 3a140a866..34e516364 100644 --- a/doc/usage.rst +++ b/doc/usage.rst @@ -31,7 +31,20 @@ creation and management of users' accounts. The ``admin`` group has similar priv the users belonging to this group are not allowed to manage other users' accounts. Once the new user account information has been specified and all requirements are met, the -``Save``button will become active and you will be able to add new account. +``Save`` button will become active and you will be able to add new account. + +Changing User Password +====================== + +Initial password is assigned by the administrator when the user account is created. +Each user should change the password when he or she first logs in to the system. +Click on the ``Profile`` menu and choose ``Settings``. The user profile information +is displayed. Click on ``Change password`` in the menu bar on the left. In the first +input box the current password must be specified. The new password must be specified +in the second input box and this password must meet the normal requirements for the +password as mentioned in the previous sections. Finally, the password must be confirmed +in the third input box. When all entered data is valid the ``Save`` button will be +activated. Clicking this button will attempt to change the password. Deploying Stork Agent -- GitLab From 71a9c408b8580b231a83ea69d6b230207dfd2316 Mon Sep 17 00:00:00 2001 From: Marcin Siodelski Date: Thu, 9 Jan 2020 18:30:26 +0100 Subject: [PATCH 04/10] [#122] Machines and app status Updated machines monitoring section and added apps monitoring section into the Stork ARM. --- doc/usage.rst | 57 +++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 48 insertions(+), 9 deletions(-) diff --git a/doc/usage.rst b/doc/usage.rst index 34e516364..6e6423b8b 100644 --- a/doc/usage.rst +++ b/doc/usage.rst @@ -79,26 +79,37 @@ environment variable to specify which TCP port the agent will listen on. Unless explicitly specified, the agent will listen on all addresses on port 8080. There are no authentication mechanisms implemented in the agent yet. Use with care! +Connecting and Monitoring Machines +================================== + Registering New Machine -======================= +~~~~~~~~~~~~~~~~~~~~~~~ Once the agent is deployed and running on the machine to be monitored, you should instruct Stork server to start monitoring it. You can do so by going to Services menu and choosing Machines. You will be presented with a list of currently registered machines. To add a new machine, click ``Add New Machine``. You need to specify the machine address or hostname -and a port. If Stork agent is running in a container, you may specify the container name. This is -particularly useful, if you built stork using ``rake docker_up`` command and the agent is running in -a container. In such case, you can use kea-agent as your hostname. If you run agent by using ``rake -run_agent``, the agent will listen on port 8888. +and a port. If Stork agent is running in a container, you should specify the container name as +a machine hostname. If you launched Stork using ``rake docker_up`` command you may specify one of +the demo container names, e.g. agent-kea, agent-bind9 etc. The demo agents are running on +port 8080. If the agent you're connecting to was launched using ``rake run_agent`` it will +listen on port 8888. Once you click Add, the server will attempt to establish gRPC over http/2 connection to the agent. Make sure that any firewalls in between will allow incoming connections to the TCP port specified. -Once a machine is added, number of parameters, such as hostname, address, agent version, number +Once a machine is added, a number of parameters, such as hostname, address, agent version, number of CPU cores, CPU load, available total memory, current memory utilization, uptime, OS, platform family, platform name, OS version, kernel, virtualization details (if any), host ID and other -information will be provided. More information will become available in the future Stork versions. +information will be displayed. + +If any applications, i.e. Kea or/and BIND9 are detected on this machine, the status of those +applications will be displayed and the link will allow for navigating to the applications' +details. + +Navigating to the discovered applications is also possible through the ``Services`` menu. + Detecting Running Applications ============================== @@ -108,7 +119,7 @@ Bind9 and Kea applications. If the agent finds them, they will be reported to th and added to the database, so that they become visible in the Stork dashboard. Monitoring Machines -=================== +~~~~~~~~~~~~~~~~~~~ To monitor registered machines, go to Services menu and click Machines. A list of currently registered machines will be displayed. Pagination mechanism is available to display larger @@ -126,7 +137,7 @@ The machine state can also be refreshed using Action menu. On the machines list, its own menu. Click on the triple lines button at the right side and choose the Refresh option. Deleting Machines -================= +~~~~~~~~~~~~~~~~~ To stop monitoring a machine, you can go to the Machines list, find the machine you want to stop monitoring, click on the triple lines button at the right side and choose Delete. Note this will @@ -134,3 +145,31 @@ terminate the connection between Stork server and the agent running on the machi will no longer monitor it. However, the Stork agent process will continue running. If you want to completely shut it down, you need to do so manually, e.g. by connecting to the machine using ssh and stopping the agent there. One way to achieve that is to issue ``killall stork-agent`` command. + + +Monitoring Applications +======================= + +Application Status +~~~~~~~~~~~~~~~~~~ + +Kea and BIND9 applications discovered on the connected machines can be listed via the top level +menu bar, under ``Services``. You can select between Kea and BIND9 applications. The list +of applications of the given type comprises the application version, application status and some +machine details. The ``Action`` button is also available which allows for refreshing the +information about the application. + +The application status comprises a list of daemons belonging to the application. For BIND9 it +is always only one daemon, ``named``. In case of Kea, several daemons can be presented in the +application status column, typically: DHCPv4, DHCPv6, DDNS and CA (Kea Control Agent). The +listed daemons are those that Stork found in the CA configuration file. The warning sign +will be displayed for those daemons from the CA configuration file that are not running. +In cases when the Kea installation is simply using the default CA configuration file, +which includes configuration of daemons that are never intended to be launched, it is +recommended to remove (or comment out) those configurations to eliminate unwanted +warnings from Stork about inactive daemons. + +Kea High Availability Status +~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +tbd -- GitLab From 533e231d3a94b80d594e1f428c7d2a0eb28262f3 Mon Sep 17 00:00:00 2001 From: Marcin Siodelski Date: Thu, 9 Jan 2020 21:32:24 +0100 Subject: [PATCH 05/10] [#122] Added section about HA monitoring --- doc/static/kea-ha-status.png | Bin 0 -> 71041 bytes doc/usage.rst | 35 ++++++++++++++++++++++++++++++++++- 2 files changed, 34 insertions(+), 1 deletion(-) create mode 100644 doc/static/kea-ha-status.png diff --git a/doc/static/kea-ha-status.png b/doc/static/kea-ha-status.png new file mode 100644 index 0000000000000000000000000000000000000000..b38100a34a5332d9a264bac95fd2ece558249b32 GIT binary patch literal 71041 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 for the details about various roles of the servers +within the HA setup. + +The following picture shows a typical High Availability status view displayed in +Stork UI. + +.. figure:: static/kea-ha-status.png + :alt: High Availability status example + + +The local server is the DHCP server (daemon) belonging to the application for which +the status is displayed. The remote server is its active HA partner. The remote +server server belongs to a different apploication running on a different machine +and this machine may or may not be monitored by Stork. The status of both the +local and the remote server is fetched by sending the +`status-get `_ +command to the Kea server which details are displayed (local server). The local +server periodically checks the status of its partner by sending the +``ha-heartbeat`` command to it. Therefore this information is not always up to +date and its age depends on the heartbeat command interval (typically 10s). The +status of the remote server includes the age of the data displayed. + +The status information contains the role, state and the scopes served by each +HA partner. In our case, both servers are in load-balancing state which +means that both are serving the DHCP clients and there is no failure. If the +remote server crashes, the local server should transition to the partner-down +state which will be reflected in this view. If the local server crashes, this +will manifest itself as a communication problem between Stork and the +server. + -- GitLab From 7914a6507b2e2c08e16dd1932b7c765df0d26998 Mon Sep 17 00:00:00 2001 From: Marcin Siodelski Date: Fri, 10 Jan 2020 09:11:46 +0100 Subject: [PATCH 06/10] [#122] Fixed too short underline In stork-agent.8.rst. --- doc/man/stork-agent.8.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/man/stork-agent.8.rst b/doc/man/stork-agent.8.rst index ee8d870ee..404204bee 100644 --- a/doc/man/stork-agent.8.rst +++ b/doc/man/stork-agent.8.rst @@ -10,7 +10,7 @@ stork-agent - Stork agent that monitors BIND 9 and Kea services -------------------------------------------------------------- +--------------------------------------------------------------- Synopsis ~~~~~~~~ -- GitLab From 37641c69737db503c62b2e1a6e19cd5324f08b04 Mon Sep 17 00:00:00 2001 From: Marcin Siodelski Date: Fri, 10 Jan 2020 09:16:22 +0100 Subject: [PATCH 07/10] [#122] Merged conflicting sections The Detecting Running Applications sections is merged into the Monitoring Applications section. --- doc/usage.rst | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/doc/usage.rst b/doc/usage.rst index 82045bfa3..86d18d618 100644 --- a/doc/usage.rst +++ b/doc/usage.rst @@ -104,20 +104,13 @@ of CPU cores, CPU load, available total memory, current memory utilization, upti family, platform name, OS version, kernel, virtualization details (if any), host ID and other information will be displayed. -If any applications, i.e. Kea or/and BIND9 are detected on this machine, the status of those +If any applications, i.e. Kea or/and Bind9 are detected on this machine, the status of those applications will be displayed and the link will allow for navigating to the applications' details. Navigating to the discovered applications is also possible through the ``Services`` menu. -Detecting Running Applications -============================== - -Once a new Machine has been registered. the Stork agent tries to detect existing running -Bind9 and Kea applications. If the agent finds them, they will be reported to the Stork server -and added to the database, so that they become visible in the Stork dashboard. - Monitoring Machines ~~~~~~~~~~~~~~~~~~~ @@ -150,16 +143,21 @@ stopping the agent there. One way to achieve that is to issue ``killall stork-ag Monitoring Applications ======================= +Once a new Machine has been registered, the Stork agent tries to detect existing running +Bind9 and Kea applications. If the agent finds them, they will be reported to the Stork server +and added to the database, so that they become visible in the Stork dashboard. + + Application Status ~~~~~~~~~~~~~~~~~~ -Kea and BIND9 applications discovered on the connected machines can be listed via the top level -menu bar, under ``Services``. You can select between Kea and BIND9 applications. The list +Kea and Bind9 applications discovered on the connected machines can be listed via the top level +menu bar, under ``Services``. You can select between Kea and Bind9 applications. The list of applications of the given type comprises the application version, application status and some machine details. The ``Action`` button is also available which allows for refreshing the information about the application. -The application status comprises a list of daemons belonging to the application. For BIND9 it +The application status comprises a list of daemons belonging to the application. For Bind9 it is always only one daemon, ``named``. In case of Kea, several daemons can be presented in the application status column, typically: DHCPv4, DHCPv6, DDNS and CA (Kea Control Agent). The listed daemons are those that Stork found in the CA configuration file. The warning sign -- GitLab From cd056d362ba2fd3b03da4fd04c18c8bd9aa5cb3a Mon Sep 17 00:00:00 2001 From: Marcin Siodelski Date: Fri, 10 Jan 2020 11:29:03 +0100 Subject: [PATCH 08/10] [#122] Addressed review comments in ARM - Change 'as of stork 0.3.0' to 'currently', - users' accounts to user accounts - localhost port 8888 rather than port 8888 - Bind9 to BIND 9 - Typo apploication - Removed duplicated text --- doc/usage.rst | 27 +++++++++++---------------- 1 file changed, 11 insertions(+), 16 deletions(-) diff --git a/doc/usage.rst b/doc/usage.rst index 86d18d618..df3ea8321 100644 --- a/doc/usage.rst +++ b/doc/usage.rst @@ -24,10 +24,10 @@ letters, numbers and underscore. E-mail field is optional. However, if specified formed e-mail. First and lastname fields are mandatory. Password must only contain letters, digits, @, ., !, +, - and must be at least 8 characters long. -As of Stork 0.3 release, the users are be associated with one of the two predefined groups (roles), +Currently, the users are be associated with one of the two predefined groups (roles), i.e. ``super-admin`` or ``admin``, which must be selected when the user account is created. The users belonging to the ``super-admin`` group are granted full privileges in the system, including -creation and management of users' accounts. The ``admin`` group has similar privileges, except that +creation and management of user accounts. The ``admin`` group has similar privileges, except that the users belonging to this group are not allowed to manage other users' accounts. Once the new user account information has been specified and all requirements are met, the @@ -51,8 +51,8 @@ Deploying Stork Agent ===================== Stork system uses agents to monitor services. Stork Agent (`STAG` or simply `agent`) is a -daemon that is expected to be deployed and run on each machine to be monitored. As of Stork 0.3.0 -release there are no automated deployment routines and STAG has to be copied and run manually. +daemon that is expected to be deployed and run on each machine to be monitored. Currently, +there are no automated deployment routines and STAG has to be copied and run manually. This can be done in a variety of ways. Here is one of them. Assuming you want to monitor services running on machine with IP 192.0.2.1, you can do the following @@ -94,7 +94,7 @@ and a port. If Stork agent is running in a container, you should specify the con a machine hostname. If you launched Stork using ``rake docker_up`` command you may specify one of the demo container names, e.g. agent-kea, agent-bind9 etc. The demo agents are running on port 8080. If the agent you're connecting to was launched using ``rake run_agent`` it will -listen on port 8888. +listen on localhost port 8888. Once you click Add, the server will attempt to establish gRPC over http/2 connection to the agent. Make sure that any firewalls in between will allow incoming connections to the TCP port specified. @@ -104,8 +104,8 @@ of CPU cores, CPU load, available total memory, current memory utilization, upti family, platform name, OS version, kernel, virtualization details (if any), host ID and other information will be displayed. -If any applications, i.e. Kea or/and Bind9 are detected on this machine, the status of those -applications will be displayed and the link will allow for navigating to the applications' +If any applications, i.e. Kea or/and BIND 9 are detected on this machine, the status of those +applications will be displayed and the link will allow for navigating to the application details. Navigating to the discovered applications is also possible through the ``Services`` menu. @@ -143,21 +143,16 @@ stopping the agent there. One way to achieve that is to issue ``killall stork-ag Monitoring Applications ======================= -Once a new Machine has been registered, the Stork agent tries to detect existing running -Bind9 and Kea applications. If the agent finds them, they will be reported to the Stork server -and added to the database, so that they become visible in the Stork dashboard. - - Application Status ~~~~~~~~~~~~~~~~~~ -Kea and Bind9 applications discovered on the connected machines can be listed via the top level -menu bar, under ``Services``. You can select between Kea and Bind9 applications. The list +Kea and BIND 9 applications discovered on the connected machines can be listed via the top level +menu bar, under ``Services``. You can select between Kea and BIND 9 applications. The list of applications of the given type comprises the application version, application status and some machine details. The ``Action`` button is also available which allows for refreshing the information about the application. -The application status comprises a list of daemons belonging to the application. For Bind9 it +The application status comprises a list of daemons belonging to the application. For BIND 9 it is always only one daemon, ``named``. In case of Kea, several daemons can be presented in the application status column, typically: DHCPv4, DHCPv6, DDNS and CA (Kea Control Agent). The listed daemons are those that Stork found in the CA configuration file. The warning sign @@ -186,7 +181,7 @@ Stork UI. The local server is the DHCP server (daemon) belonging to the application for which the status is displayed. The remote server is its active HA partner. The remote -server server belongs to a different apploication running on a different machine +server server belongs to a different application running on a different machine and this machine may or may not be monitored by Stork. The status of both the local and the remote server is fetched by sending the `status-get `_ -- GitLab From 0f64954bd7352451bc7fa0c2b15cd3bb2437f102 Mon Sep 17 00:00:00 2001 From: Marcin Siodelski Date: Fri, 10 Jan 2020 11:41:50 +0100 Subject: [PATCH 09/10] [#122] Added Changelog for #122 --- ChangeLog.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/ChangeLog.md b/ChangeLog.md index 26a23b844..722aab285 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -1,3 +1,10 @@ +* 22 [doc] marcin + + Updated Stork ARM. Added documentation of the High Availability + status monitoring with Kea. Added new sections describing applications + management. + (Gitlab #122) + * 21 [func] godfryd Added new Rake tasks to build and start two containers -- GitLab From d34b4496b524eaecc2131279ef6f7e298a05134b Mon Sep 17 00:00:00 2001 From: Marcin Siodelski Date: Fri, 10 Jan 2020 11:43:54 +0100 Subject: [PATCH 10/10] [#122] Further replace BIND9 with BIND 9 Per review comments. --- doc/install.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/doc/install.rst b/doc/install.rst index 16a8546e0..40d8e32c7 100644 --- a/doc/install.rst +++ b/doc/install.rst @@ -45,16 +45,16 @@ The installation procedure will create several Docker images: - `stork_webui`: exposing web UI interface, - `stork_server`: running a server backend, - `postgres`: running a PostgreSQL database used by the server, -- `stork_agent-bind9`: running an demo instance of BIND9, +- `stork_agent-bind9`: running an demo instance of BIND 9, - `stork_agent-kea`: running a demo instance of Kea DHCPv4 server, - `stork_agent-kea-ha1`: running the primary Kea DHCPv4 server in High Availability mode, - `stork_agent-kea-ha2`: running the secondary Kea DHCPv4 server in High Availability mode .. note:: - The containers running Kea and BIND9 applications are for demo purposes only. They + The containers running Kea and BIND 9 applications are for demo purposes only. They allow the users to quickly start playing with Stork without having to manually - deploy Kea and/or BIND9 instances. + deploy Kea and/or BIND 9 instances. The PostgreSQL database schema will be automatically migrated to the latest version required by the Stork server process. -- GitLab