In the spirit of application, adding a rudimentary readme.
Dev

Dev commited on 2018-06-18 00:35:47
Showing 1 changed files, with 42 additions and 0 deletions.

... ...
@@ -0,0 +1,42 @@
1
+# Notes on tool's architecture
2
+
3
+This is Rudimentary Configuration Management (RCM) tool and is super true to its name. Everything is under `RCM` module/namespace to differentiate with other gems/ruby classes on the system.
4
+
5
+Things are dependent on order of execution; especially if a resource is created by another one in the run. In our case, this is experienced for managing `/var/www/html/index.html` file as it is created by installation of `apache2`.
6
+
7
+## Target system configuration
8
+
9
+`apache2`, `php5`  and `libapache2-mod-php5` are installed. Then default `/var/www/html/index.html` is deleted and `/var/www/html/index.php` is dropped in its place.
10
+
11
+## Structure
12
+
13
+The layout of the project is as simple as it can be. All objects are in `objects` folder, while all the functions that execute on those objects, or their collection are in respective file in `managers` folder. `task.rb` is the controller and also doubles up as configuration parser and validator via `whatchugot`, `parse_packages`, `parse_files` and `parse_services`. Config parsing can be moved to its own class, but it was left as it is for this task as I tend to go into a rabbit-hole... and I need to deliver a solution asap.
14
+
15
+### Configration and resources
16
+
17
+YAML parser is natively available in ruby core, and was chosen over JSON for its easier markup. There are only in 3 sections in `config.yaml` - `packages`, `files` and `services` - and they are processed in that order. Files needed by the program (`hello_world.php`) are in `resources` folder. Dependencies can be specified for services, with a condition that `path` for file and `name` for package need to appear in respective section. There is no way to specify dependency for package or file at this time.
18
+
19
+### Objects
20
+
21
+All objects are under `objects` folder. `rcm_file`, `rcm_project` and `rcm_service` provide abstraction of respective resource for RCM purposes. They hold everything needed to evaluate current vs desired state.
22
+
23
+### Managers
24
+
25
+All functions that can be performed on an object or their collection are held in `managers` folder. Some of the functions in respective classes can be moved to object itself... and this thought would buttress what I mentioned earlier about going into rabbit-hole :P.
26
+
27
+For file operations, I rely on `FileUtils` provided by ruby core, whereas I execute commands on systems for packages. Had I used Python, there was an API available to interact with package system. After all, apt is also a Python application.
28
+
29
+## How's the tool working
30
+
31
+`bootstrap.sh` ensures `ruby2.0` is installed.
32
+
33
+`task.rb` is the main file and contains `main`. `config_<env>.yaml` holds environment dependent configuration. If `ENVIRONMENT` is not set, `config.yaml` is loaded, otherwise program expects environment dependent configuration as mentioned above.
34
+
35
+Config file is loaded at startup and various checks done to make sure configuration is is correct... within the bounds of this task. For example, for file resource `desired_state` is checked to be one of available types; and it is made sure that `local_file` is readable _if_ state is set to present. If there are dependencies mentioned for a service, a pointer to the resource is held respectively in `depends_file` and `depends_package` in `::RCM::Package` object.
36
+
37
+State is maintained in 2 objects:
38
+
39
+1. `@wanted` holds the state as mentioned in `config.yaml` or `config_<env>.yaml`. It is populated in `parse_packages`, `parse_files` and `parse_services`.
40
+2. `@got` holds the state of resources currently present on the system.
41
+
42
+I first get `get_current_state` of packages and `converge_packages` because in current configuration, there is a file that appears only upon installation of `apache2` package. I then `get_current_state` of files and `converge_files`. Finally `restart_services_if_needed`.
0 43