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 |